为什么这个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 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)),lambda,functional-programming,lisp,racket,Lambda,Functional Programming,Lisp,Racket,从我所读到的内容来看,在Racket中传递参数的格式应该是- (define (id id id) expression) 为什么它不适用于三年?三个是如何工作的 EDIT1-当我运行(pow1 2)时,我得到一个错误,表示给定的参数数为1,当我编写(pow1 2 3 4)时,它表示参数数为3。发生了什么事 (define pow2 (lambda(x) (lambda(y) (pow1 x y)))) 这将pow2定义为某种lambda表达式 (define thr

从我所读到的内容来看,在Racket中传递参数的格式应该是-

(define (id id id) expression)
为什么它不适用于三年?三个是如何工作的

EDIT1-当我运行
(pow1 2)
时,我得到一个错误,表示给定的参数数为1,当我编写
(pow1 2 3 4)
时,它表示参数数为3。发生了什么事

(define pow2
  (lambda(x)
    (lambda(y)
      (pow1 x y))))
这将
pow2
定义为某种
lambda
表达式

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

(pow2 3)
; inline pow2
((lambda(x)
   (lambda(y)
     (pow1 x y)))
  3)
将lambda(参数
x
)应用于值(例如
3
)可替换lambda主体中的值(即,我们可以用
3
替换
x
):

现在这是
three
的值

执行
(三个2)
的过程如下:

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

。。。从那以后,只需调用
pow1

我很确定
(定义s“hello”)
只需定义一个变量
s
(如
“hello”
)。这不是一个函数。类似地,
三个
将绑定到
(pow2 3)
的结果。我的坏消息。我不是在问s。我只是想知道三个会怎样执行。(三个2)返回9,但为什么?注意,
(define(id)expression)
只是
(define id(lambda(id)expression))的缩写。
。值得知道的一点是,
(define(x…)
的语法缩写(define x(lambda(…)
在Racket(以及更一般的Scheme)中)因此,
pow2
可以定义为
(define(pow2 x)(lambda(y)(pow1 x y))
,这可能更清楚:
pow2
是一个返回函数的函数。请检查编辑。
(three 2)
; inline three
((lambda(y)
   (pow1 3 y))
  2)
; apply lambda
(pow1 3 2)