【问题标题】:lambda syntax in scheme language方案语言中的 lambda 语法
【发布时间】:2017-08-10 08:20:34
【问题描述】:

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

In Scheme the syntax for anonymous functions is the following one:

(lambda (arg1...argn) body)

...

We can now easily define the compose function

(define (compose f g)
  (lambda (x) (f (g x))))

我很难理解x,它不在compose 函数定义的参数列表中。那么x 是如何传入的呢?

另外,假设我们有函数g1 接受参数yz,如何调用composecompose (f1 g1) y z?如果是这样,那么它不仅需要两个函数的参数,还需要来自 g1 的参数。我很困惑。

【问题讨论】:

  • x 是结果合成的参数。假设你有函数f1g1 和参数x1,那么你可以这样称呼它((compose f1 g1) x1)

标签: lambda functional-programming scheme


【解决方案1】:

自从

(define (compose f g)
  (lambda (x) (f (g x))))

我们有

             (compose + *) 

评估为

             (lambda (x) (+ (* x))).

也就是说,在

 ((compose + *) 42)

我们得到

    ((compose + *) 42)
 => ((lambda (x) (+ (* x))) 42)
 => (+ (* 42))
 => (+ 42)
 => 42

【讨论】:

    【解决方案2】:

    首先列出名称和参数是语法糖。所以要完全理解它,让我们充分扩展它:

    (define compose
      (lambda (f g)     ; compose
        (lambda (x)     ; body
          (f (g x))))
    

    首先请注意,名称 compose 被赋予了外部 lambda 表达式的求值结果,它变成了两个参数的闭包。

    因此,当您调用(compose f2 f1) 时,绑定到fg 的参数赌注和主体表达式(lambda (x) (f (g x))) 被评估。它成为一个参数闭包。您可以在此处使用定义:

    (define special-function (compose f2 f1))
    

    为了使用该函数,您需要再次调用它。因此。 (special-function 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
    

    【讨论】:

      猜你喜欢
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多