【问题标题】:What does the use of multiple lambdas in scheme mean?在方案中使用多个 lambda 是什么意思?
【发布时间】:2012-12-18 05:18:52
【问题描述】:

我目前正在学习方案,我遇到了这些功能:

(define t (lambda (x) (lambda (y) x))) 
(define f (lambda (x) (lambda (y) y))) 

显然,它们是将真假表示为函数。我不知道为什么!

我有两个问题:

1) 连续的 lambda 是什么意思?我只习惯于看到一个用于将参数传递给函数的 lambda;即

(define add
  (lambda (x y)
    (+ x y)))

通过调用(add 1 5),我将获得6 作为输出。

2) 如何使用这些真假函数?

【问题讨论】:

    标签: lambda functional-programming scheme currying lambda-calculus


    【解决方案1】:

    这里发生的事情被称为currying - 将一个接受 n 个参数的函数转换为可以作为函数链调用的方式

    让我们考虑一个有 2 个参数的函数 f,即 f(x,y)。存在一个一元函数 g 使得 f(x,y) = g(x)(y) =(g(x))(y)。函数 g 被称为 f 的 curried 版本。

    g 是一个函数,它需要一个参数 (x),而 g(x) 的值也是一个参数 y 的函数。

    让我们考虑一个 curried-add 函数:

    (define curried-add 
      (lambda (x) 
        (lambda (y) (+ x y))))
    
    ((curried-add 1) 5)
    

    对 (curried-add 1) 的调用将返回一个函数,该函数接受一个参数,在我们的例子中是 5 并将其添加到 1,给出和输出 6。

    我们可以将这些 curried-add 链接在一起得到:

    ((curried-add ((curried-add 1) 2)) 3)
    

    将产生 6 的输出。这是因为 (curried-add 1) 将返回一个需要一个参数的函数,在本例中为 2。因此 1 与 2 相加并生成一个需要一个参数的函数,该参数可以是添加到我们刚刚制作的 3 个中。

    在这种情况下,您的 true 和 false 函数。

    正确的是:(define t (lambda (x) (lambda (y) x)))

    错误为:(define f (lambda (x) (lambda (y) y)))

    true 函数接受两个参数并返回第一个,false 函数 返回两个参数中的第二个。

    【讨论】:

      【解决方案2】:

      正如@Hayden 在他的回答中指出的那样,连续的 lambda 是currying 的一个例子,本质上只是一个返回另一个函数的函数:

      在数学和计算机科学中,柯里化是一种转换具有 n 个多个参数(或参数的 n 元组)的函数的技术,它可以被称为函数链,每个函数都有一个论据(部分应用)。它由 Moses Schönfinkel 提出,后来被 Haskell Curry 重新发现

      对于问题的第二部分:布尔值可以编码为函数,它是在lambda calculus 中使用Church booleans 表示真值,请参阅链接以了解它们的使用方式:

      Church 布尔值是布尔值 true 和 false 的 Church 编码。一些编程语言使用这些作为布尔运算的实现模型;例如 Smalltalk 和 Pico。布尔值表示为两个值的函数,这些值的结果是它们的一个或另一个参数。 lambda演算中的正式定义:

      true ≡ λa.λb. a
      false ≡ λa.λb. b
      

      【讨论】:

        【解决方案3】:

        它们是函数,当使用 1 个参数调用时会返回另一个函数。所以你可以这样称呼他们 -

        (define v (some expression that returns t or f))
        ((v 'foo) 'bar) ; ==> foo if v is t, bar if v is f
        

        这有点像带有普通内置布尔值的(if v 'foo 'bar)。它通常用于在简单的 lambda 演算中对真/假进行编码。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-04-06
          • 2010-12-07
          • 2017-02-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-08
          相关资源
          最近更新 更多