【问题标题】:Scheme define/lambda shorthand方案定义/lambda 简写
【发布时间】:2011-02-26 01:25:05
【问题描述】:

在 Scheme 中,我如何在我的定义中使用 define/lambda 简写来表示嵌套的 lambda 表达式?

例如给出以下过程...

(define add
  (lambda (num1 num2)
    (+ num1 num2)))

可以将其缩短为:

(define (add num1 num2)
  (+ num1 num2))


但是,我怎样才能类似地缩短以下功能?

(define makeOperator
  (lambda (operator)
    (lambda (num1 num2)
      (operator num1 num2))))

;example useage - equivalent to (* 3 4):
((makeOperator *) 3 4)

【问题讨论】:

    标签: lambda scheme


    【解决方案1】:
    (define (makeOperator operator)
      (lambda (num1 num2)
        (operator num1 num2)))
    

    第二个 lambda 不能缩短。

    如果您不想强制返回的函数只接受两个参数,您可以将其缩短为 (define (makeOperator operator) operator)

    【讨论】:

    • 谢谢 - 一旦我的投票限制重置,我会为你 +1 :)。 scheme.com/tspl2d/start.html#g1642 - 如果你向下滚动一点,作者似乎在谈论某种用于缩短定义的点语法。知道他在说什么吗?
    • @incrediman:是的,他说的是(define (f . xs) ...),它允许您使用任意数量的参数(例如(f 1 2 3 4 5))调用f,而xs 将是一个包含这些参数的列表。
    • 啊。明白了 - 谢谢。这本身实际上非常有用,所以我很高兴我问了:)
    【解决方案2】:

    Scheme 的一些实现——例如 Guile(使用 1.8 版测试)和 MIT Scheme——提供以下速记符号:

    (define ((foo x) y) (+ x y))
    
    (foo 5)
    ; => procedure
    ((foo 5) 3)
    ; => 8
    

    我相信这种表示法在Structure and Interpretation of Classical Mechanics 中被大量使用。

    【讨论】:

      【解决方案3】:

      与上述答案相反,第二个lambda可以使用简写define表示法:

      (define (makeOperator operator)
        (define (foo num1 num2)
          (operator num1 num2))
        foo)
      

      【讨论】:

      • 这不是一回事。在我更简单的速记中,没有声明额外的变量,但在这里你声明了 foo.因此,虽然它确实使用了定义语法,但它并不是真正的简写。此外,它比 sepp2k 的 lambda 版本更长。 /结束相对未受过教育的意见
      • (a) 我没有说它更短——只是它使用了您所询问的 shorthand define 形式; (b) 您的问题是是否可以将此表示法用于内部 lambda - 显然,这将带有一个额外的名称,因为这正是 define 所做的:没有名称就无法使用它。
      • 哦,顺便说一句,如果你的目标是让它简短,那么正如 sepp2k 所说,你可以使用(define (makeOperator operator) operator),如果你真的想一路走下去:(define makeOperator values) 大致是一样的。
      • @Eli:我想他可能一直在寻找类似(define ((makeOperator operator) num1 num2) operator num1 num2) 的东西,即柯里化函数定义,它在方案中不存在(但可能用宏来实现)。
      • @sepp2k:是的,这就是我想要的——谢谢。 @Eli:再想一想,这实际上确实很好地回答了我的问题,即使它不完全是我想要的,所以+1。我也意识到我的小例子可以简化:) 谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多