【问题标题】:Why does this racket function need an argument? And how does it work?为什么这个球拍函数需要一个参数?它是如何工作的?
【发布时间】:2018-02-18 08:36:54
【问题描述】:

我是 Racket 的初学者,以下代码来自华盛顿大学的 Racket 编程课程-

(define s "hello")
(define (pow1 x y)
  (if(= y 0)
     1
     (* x (pow1( - y 1)))))

(define pow2
  (lambda(x)
    (lambda(y)
      (pow1 x y))))
(define three (pow2 3))

根据我的阅读,对于要在 Racket 中传递的参数,格式应该是 -

(define (id id id) expression)

为什么对三个不成立?三者究竟是如何工作的?

EDIT1- 当我运行 (pow1 1 2) 时,我收到一个错误,说给定的参数数量是 1,而当我写 (pow1 2 3 4) 时,它说参数数量是 3。这是怎么回事?

【问题讨论】:

  • 我很确定(define s "hello") 只是定义了一个变量s(如"hello")。这不是一个函数。同样,three 将绑定到 (pow2 3) 的结果。
  • 我的错。我不是在问s。我只是想知道三个将如何执行。 (三 2) 返回 9 但为什么呢?那2去哪儿了?
  • 请注意(define (id id id) expression) 只是(define id (lambda (id id) expression)) 的缩写。
  • 有一点值得知道,(define (x ...) ...) 是 Racket 中(define x (lambda (...) ...) 的语法简写(以及更普遍的 Scheme 中)。所以pow2 可以定义为(define (pow2 x) (lambda (y) (pow1 x y))),这可能更清楚:pow2 是一个返回函数的函数。
  • 大伙儿请检查编辑。

标签: lambda functional-programming lisp racket


【解决方案1】:
(define pow2
  (lambda(x)
    (lambda(y)
      (pow1 x y))))

这将pow2 定义为某种lambda 表达式。

(define three (pow2 3))

这将three 定义为(pow2 3) 的结果。 (pow2 3) 是什么?好吧,让我们内联pow2的值:

(pow2 3)
; inline pow2
((lambda(x)
   (lambda(y)
     (pow1 x y)))
  3)

将 lambda(参数 x)应用于值(例如 3)会替换 lambda 主体中的值(即,我们可以将 x 替换为 3):

(lambda(y)
  (pow1 3 y))

现在这是three 的值。

执行(three 2) 的过程如下:

(three 2)
; inline three
((lambda(y)
   (pow1 3 y))
  2)
; apply lambda
(pow1 3 2)

...从那里开始只需拨打pow1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 2023-01-25
    • 2021-06-29
    • 2021-07-13
    相关资源
    最近更新 更多