scheme语言中的lambda语法
我正在学习函数式编程。当我读到关于介绍的lambda部分时,我想到了一个问题 我很难理解scheme语言中的lambda语法,lambda,functional-programming,scheme,Lambda,Functional Programming,Scheme,我正在学习函数式编程。当我读到关于介绍的lambda部分时,我想到了一个问题 我很难理解x,它不在compose函数定义的参数列表中。那么x是如何传入的呢 另外,假设我们有函数g1取参数y,z,如何调用compose组合(f1 g1)y z?如果是这样,那么它不仅接受两个函数的参数,还接受来自g1的参数。我很困惑。因为 (define (compose f g) (lambda (x) (f (g x)))) 我们有 (compose + *) 评估为
x
,它不在compose
函数定义的参数列表中。那么x
是如何传入的呢
另外,假设我们有函数g1
取参数y
,z
,如何调用compose
<代码>组合(f1 g1)y z?如果是这样,那么它不仅接受两个函数的参数,还接受来自g1的参数。我很困惑。因为
(define (compose f g)
(lambda (x) (f (g x))))
我们有
(compose + *)
评估为
(lambda (x) (+ (* x))).
就是在
((compose + *) 42)
我们得到
((compose + *) 42)
=> ((lambda (x) (+ (* x))) 42)
=> (+ (* 42))
=> (+ 42)
=> 42
首先,在名称和参数周围有一个列表是语法sugar。因此,要完全理解它,让我们将其完全扩展:
(define compose
(lambda (f g) ; compose
(lambda (x) ; body
(f (g x))))
首先请注意,名称compose
被赋予外部lambda表达式的求值结果,它变成了一个双参数闭包
因此,当您调用(compose f2 f1)
时,将对绑定到f
和g
的参数下注,并计算主体表达式(lambda(x)(f(gx))
。它变成了一个单参数闭包。您可以使用此处定义:
(define special-function (compose f2 f1))
为了使用该函数,您需要再次调用它。因此<代码>(特殊功能5)与评估(f2(f1 5))
相同。使用替换规则很容易看到
那么为什么要这样做呢?好。我们的函数只包含一个函数,比如map
,而不是编写:
(map (lambda (x) (f2 (f1 x))) '(1 2 3 4))
你可以写
(map (compose f2 f1) '(1 2 3 4))
这基本上是完全相同的表达式,稍微容易一点
真实世界中的compose
函数实际上接受任意数量的参数,并且它的最后一个参数,即首先应用的函数,将决定结果函数的算术性。因此,在球拍中,你可以做到:
((compose add1 add1 *) 3 7)
; ==> 23
x
是结果合成的参数。假设您有函数f1
和g1
以及参数x1
,那么您可以这样调用它((组合f1 g1)x1)
。
((compose add1 add1 *) 3 7)
; ==> 23