scheme语言中的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 + *) 评估为

我正在学习函数式编程。当我读到关于介绍的lambda部分时,我想到了一个问题

我很难理解
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