【问题标题】:What's the reason for using lambda expressions to define functions in Scheme?Scheme中使用lambda表达式定义函数的原因是什么?
【发布时间】:2013-12-30 06:41:03
【问题描述】:

我正在阅读 Daniel Friedman 的 The Little Schemer 一书。我不明白为什么书中的每个函数都是用 lambda 表达式编写的。

(define fun1
  (lambda (x1 x2)
    (+ x1 x2)))

(define (fun2 x1 x2)
  (+ x2 x2))

这两个函数做同样的事情,但第二个更简洁。我很好奇到处使用 lambda 的原因。

在这种情况下我使用了 DrRacket。

【问题讨论】:

    标签: lambda scheme the-little-schemer


    【解决方案1】:
    (define (x . a) ...) 
    

    只是

    的缩写
    (define x (lambda a ...))
    

    在 1975 年的第一份计划报告中,您没有这个缩写。在 1978 年的修订报告中引入了它。

    The little Schemer 只是 1974 年 The little Lisper 的较新版本。它早于 Scheme,当固定为遵循 Scheme 时,他们试图保持与尽可能原创。此外,当您使用(define x (lambda (arg1) ...)) 时,很明显,过程绑定与其他变量绑定没有什么不同,除了它指向的对象是闭包代码而不是数据。

    如果您查看SICP video lectures,您会发现 Abelson 和 Sussman 确实有学生对此感到困惑,所以最好只使用其中一个,因为匿名程序是您最终需要接触的东西,很明显您想用显式的 lambda 而不是语法糖来教授表单。

    【讨论】:

      【解决方案2】:

      这只是风格问题。在 The Little Schemer 中,作者决定使用 lambdas 显式声明过程,以明确函数定义为过程分配名称(它只是一个带有值的表达式,就像任何其他的一样)。

      另一种声明函数的方式(没有显式 lambdas)是完全等价的,它只是语法糖。有人可能会争辩说,作者选择更明确的语法是出于教学而非实际原因。

      【讨论】:

        【解决方案3】:

        lambda 表达式是一个函数字面量,就像 3(例如)是一个整数字面量一样。您可以想象一种编程语言,您不能在更大的表达式中使用 3,但必须定义一个变量并将其初始化为 3。它仍然可以工作,但会很不方便并且会妨碍您。大多数语言都与函数类似(它们可以只定义一次,然后调用),但函数式语言让您可以像对待任何其他变量一样对待函数,包括能够按字面意思引用它们。

        就像当你需要一个特定的整数但不需要麻烦变量时使用整数文字一样,当你需要一个函数但不需要为它命名时使用 lambda 表达式。

        一个常见的用途是使用像 mapcar 这样的函数,它将一个函数作为参数并将该函数应用于另一个参数中的所有元素。有时您只想在其中添加一次性功能,而无需为其命名。

        只看那个特定的例子,我猜他们指出了 scheme 和 lisp 之间的区别(lisp 的做法有些不同)。

        【讨论】:

        • 你确定吗,有没有参考资料?
        • 我确定什么?什么是 lambda 表达式?是的。查看任何有关编程语言的基础教科书。
        • 这并没有回答这个问题,即为什么许多人喜欢更冗长的(define foo (lambda ...) 而不是更简洁的(define (foo ...) ...)
        【解决方案4】:

        我自己刚刚完成Little LISPer。最初,我对他们为什么使用这个奇怪的成语感到困惑。正如你所说,后者是前者的糖,当然看起来更整洁,那么到处使用匿名函数有什么意义呢?

        从教学的角度来看,我认为它可以让读者更好地为最后几章做好准备,包括柯里化、高阶函数、lambda 演算等等。特别是,应用顺序 Y 组合子的推导需要在其他上下文中使用您可能称之为“不必要的函数包装”的东西。到倒数第二章,你已经非常熟悉这个过程,推导出 Y 组合子并不比倒咖啡或烤面包更难。好吧——不是真的,但我认为作者采用的风格肯定有助于让你更接近理解这个困难的想法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-22
          • 1970-01-01
          • 1970-01-01
          • 2015-08-09
          • 2018-09-11
          • 2019-07-09
          相关资源
          最近更新 更多