Scheme (DrRacket) 语法 - 括号
Scheme (DrRacket) syntax - parentheses
我们来看看以下函数:
(define Increment1 (λ(x)(+ x 1)))
(define (Increment2)
(define (inc2 x)(+ x 1))
inc2)
它们都return函数增加x。
问题一:
给定代码:
(define Func Increment2)
(Func 2)
为什么会出现错误? (预期参数数量 = 0,给定 = 1),
而代码
(define Func2 (Increment2))
(Func2 2)
会工作,return 3。这是为什么?
问题2:为什么用lambda定义函数时,不需要用括号括起来? (案例增量1)
另一方面,为什么我们在不使用 lambda 时将函数名用括号括起来? (案例增量 2)
问题 3:让我们定义一个函数 (define Func3 (λ(F x)(F x)))
。
为什么 (Func3 Increment1 2)
会工作但 (Func3 Increment2 2)
会失败? (与问题 1 相同的错误)。
谢谢。
Increment2
是一个函数,其return值是一个函数。因此,需要调用Increment2
得到它的return值,这是一个函数。
正在查看您的第二个列表:
(define Func2 (Increment2))
(Func2 2)
我们注意到 Func2
是 Increment2
的 return 值,它是一个函数。因此你可以调用它。所以 Increment2
指向一个接受 0 个参数的函数,但是调用它 return 是一个接受一个参数的函数。
—
关于你的第二个问题,lambda 是一个匿名函数。所以 (define Func3 (λ(F x)(F x)))
是一个变量定义,您将变量 Func3
绑定到一个匿名函数,因此,您正在命名它,它将充当常规函数。
事实上,您刚刚发现 (define (fun args) ...)
语法是将变量绑定到匿名函数的语法糖。
—
关于你的第三个问题,如果你明白我对你第一个问题的回答,你应该可以回答。
我们来看看以下函数:
(define Increment1 (λ(x)(+ x 1)))
(define (Increment2)
(define (inc2 x)(+ x 1))
inc2)
它们都return函数增加x。
问题一: 给定代码:
(define Func Increment2)
(Func 2)
为什么会出现错误? (预期参数数量 = 0,给定 = 1), 而代码
(define Func2 (Increment2))
(Func2 2)
会工作,return 3。这是为什么?
问题2:为什么用lambda定义函数时,不需要用括号括起来? (案例增量1) 另一方面,为什么我们在不使用 lambda 时将函数名用括号括起来? (案例增量 2)
问题 3:让我们定义一个函数 (define Func3 (λ(F x)(F x)))
。
为什么 (Func3 Increment1 2)
会工作但 (Func3 Increment2 2)
会失败? (与问题 1 相同的错误)。
谢谢。
Increment2
是一个函数,其return值是一个函数。因此,需要调用Increment2
得到它的return值,这是一个函数。
正在查看您的第二个列表:
(define Func2 (Increment2))
(Func2 2)
我们注意到 Func2
是 Increment2
的 return 值,它是一个函数。因此你可以调用它。所以 Increment2
指向一个接受 0 个参数的函数,但是调用它 return 是一个接受一个参数的函数。
—
关于你的第二个问题,lambda 是一个匿名函数。所以 (define Func3 (λ(F x)(F x)))
是一个变量定义,您将变量 Func3
绑定到一个匿名函数,因此,您正在命名它,它将充当常规函数。
事实上,您刚刚发现 (define (fun args) ...)
语法是将变量绑定到匿名函数的语法糖。
—
关于你的第三个问题,如果你明白我对你第一个问题的回答,你应该可以回答。