【问题标题】:dont understood lambda expression on scheme不懂方案上的 lambda 表达式
【发布时间】:2019-12-05 02:38:02
【问题描述】:

我试图意识到这个过期时间,但不明白。

( lambda (a b) (lambda (x y) (if b (+ x y a) (-x y a)))

我认为, a是一个数字,b是#t或#f, 在 if 语句中我们询问 b 是否为真,如果是则返回第一个表达式(求和 3 个数字),否则返回第二个表达式(减去 3 个数字)

我需要在 Racket 上写什么来运行它? 我试试

(define question( lambda (a b) (lambda (x y) (if b (+ x y a) (-x y a)))))

(question 5 #f)

在这种语言中没有什么不好的地方。

【问题讨论】:

    标签: scheme


    【解决方案1】:

    这不是一个完整的答案,因为我不想为你做作业。

    首先,格式化和缩进代码对任何编程语言都有帮助。您几乎可以肯定可以访问可以执行此操作的编辑器。下面我已经做到了。

    那么,好的,(λ (...) ...) 这样的形式表示什么?好吧,它是一个函数,它接受一些参数(第一个省略号)并返回其主体中最后一个形式的值(第二个省略号),或者是纯函数语言中的主体中的唯一形式。

    那么,做什么:

    (λ (a b)
      (λ (x y)
        ...))
    

    表示?它是一个有两个参数的函数,它返回一些东西:它返回的东西是什么?嗯,它是一个看起来像(λ (...) ...) 的表格:你已经知道这些表格的含义了。

    最后我们可以填写最后一个省略号(纠正错误后:(-x ...)(- x ...)不一样):

    (λ (a b)
      (λ (x y)
        (if b
            (+ x y a)
            (- x y a))))
    

    那么现在,你会怎么称呼它,以及如何让它做一些有趣的事情(比如实际添加或减去一些东西)?

    【讨论】:

      【解决方案2】:
      (lambda (a b) (lambda (x y) (if b (+ x y a) (- x y a))))
      

      是一个接受两个参数的函数(这就是(lambda (a b) ...) 所说的)。

      您可以使用替换方法来发现它产生了什么。
      将其应用于5#f

      ((lambda (a b) (lambda (x y) (if b (+ x y a) (- x y a)))) 5 #f)
      

      [将a替换为5,将b替换为#f]:

      (lambda (x y) (if #f (+ x y 5) (- x y 5)))
      

      这是一个接受两个数字并产生一个新数字的函数。
      (请注意,#f5 已通过外部 lambda 的应用修复。)

      如果我们将其命名(来自 DrRacket 的交互),则更容易使用该函数:

      > (define question (lambda (a b) (lambda (x y) (if b (+ x y a) (- x y a)))))
      > (question 5 #f)
      #<procedure>
      

      这是预期的,基于上述推理。

      让我们也为这个函数命名:

      > (define answer (question 5 #f))
      

      并使用它:

      > (answer 3 4)
      -6
      

      或者我们可以不命名使用它:

      > ((question 5 #f) 3 4)
      -6
      

      或者你可以内联,但这是一个可怕的难以理解的混乱:

      > (((lambda (a b) (lambda (x y) (if b (+ x y a) (- x y a)))) 5 #f) 3 4)
      -6
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-03
        • 1970-01-01
        相关资源
        最近更新 更多