为什么这个球拍功能需要参数?它是如何工作的?

时间:2017-09-09 17:04:34

标签: lambda functional-programming lisp 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。发生了什么事?

1 个答案:

答案 0 :(得分:3)

(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替换为{{ 1}}):

3

现在这是(lambda(y) (pow1 3 y)) 的价值。

three这样做:

(three 2)

......从那以后只需拨打(three 2) ; inline three ((lambda(y) (pow1 3 y)) 2) ; apply lambda (pow1 3 2)