Function 将表单定义为函数名?

Function 将表单定义为函数名?,function,scheme,definition,combinators,combinatory-logic,Function,Scheme,Definition,Combinators,Combinatory Logic,我想知道该代码在方案中的含义: (define ((K x) y) x) (define (((S x) y) z) ((x z) (y z))) 整个文件都是 这是合法的计划吗?(kx)是一个参数化函数,类似于Java中的泛型函数吗?我查了一下,似乎没有提到这类定义。在麻省理工学院的方案中尝试它是可行的 (define ((K x) y) x) ;Value: k ((k 3) 4) ;Value: 3 显然,这些是来自a的K和S组合子的定义 我们可以明确地定义相同的函数 (def

我想知道该代码在方案中的含义:

(define ((K x) y) x)

(define (((S x) y) z)
  ((x z) (y z)))
整个文件都是


这是合法的计划吗?(kx)是一个参数化函数,类似于Java中的泛型函数吗?我查了一下,似乎没有提到这类定义。

在麻省理工学院的方案中尝试它是可行的

(define ((K x) y) x)
;Value: k

((k 3) 4)
;Value: 3
显然,这些是来自a的
K
S
组合子的定义

我们可以明确地定义相同的函数

(define k (lambda (x) (lambda (y) x)))
;Value: k

((k 3) 4)
;Value: 3
很显然,麻省理工学院的方案为我们做到了这一点,就像常规定义(如
(定义(fun-foo)bar)
被翻译成
(定义fun(lambda(foo)bar))
一样

S
组合符将明确定义为

(define S (lambda (x) (lambda (y) (lambda (z) 
  ((x z) (y z))))))

(define ((add a) b) (+ a b))
;Value: add

(define (add1 a) (+ a 1))
;Value: add1

(((s add) add1) 3)
;Value: 7
这就是语言(如Haskell)的工作方式,其中每个函数都是一个参数的函数。Haskell在这方面非常接近组合逻辑,根本没有使用括号,我们可以编写与之相同的定义

_K x y = x
_S x y z = x z (y z)

因此,
\u S(+)(1+)3
生成
7

它被称为Curried函数速记并进行了描述。

谢谢。现在我看到了Scheme函数定义语法存在的原因,因此可以递归地提取它。@Jiaji您可能不想依赖这种行为。我以前从未见过它。它可能不是标准的(但可能是)。它也适用于Racket博士的R5R。R5RS标准在第节中只给出了
(define…
(define(variable…)
,因此我不确定这是否真正合法。但是,我可以看到将
(define(.args)body)
转换为
(define(lambda args body))
并继续应用的编译器在哪里the@Jiaji递归转换将以适当的定义结束。也许Scheme的更高版本确实将其定义为语法转换,但我认为它在R5RS中在技术上是不合法的,因为规范只允许带有变量的形式:
(define…
(define(…)…)
@WillNess Re:“显然,MIT Scheme为我们这样做,就像在常规定义中一样(define(fun-foo)bar)被翻译为(define-fun(lambda(foo)bar))。“是否执行其他版本的方案(即,不是R5RS,这是我的go-to方案)实际上,将其定义为翻译,而不是R5RS列举不同的法律
define
形式?@JoshuaTaylor我不知道。这对我来说也是一个惊喜。我认为你的猜测是正确的,编译器继续应用转换。你最常用的是Racket博士的R5RS吗?