【发布时间】:2022-01-04 15:28:12
【问题描述】:
已经好几个小时了,我无法理解 OCaml 中的这个示例。
我不知道该怎么想,所以我会尝试给出我的思考过程。
问题是:对于每个定义或表达式,给出类型和值(包括
这是整个代码(顶层):
let rec church_of_int n =
if n = 0 then fun f x -> x
else fun f x -> church_of_int (n-1) f (f x);;
let three f x = church_of_int 3 f x;;
three (fun x -> x + 1) 0;;
three three (fun x -> x + 1) 0;;
1) 第一个区块
let rec church_of_int n =
if n = 0 then fun f x -> x
else fun f x -> church_of_int (n-1) f (f x);;
这是一个由于 int 运算符“-”n-1 而采用 int 的函数,并返回一个带有两个参数 'a 和 'b 的函数。由于fun f x -> x,返回的函数返回相同类型的'b。
因此类型是:
int -> ('a -> 'b) -> 'b = <fun>
但是顶层说:
val church_of_int : int -> ('a -> 'a) -> 'a -> 'a = <fun>
我不明白...
2) 第二块
let three f x = church_of_int 3 f x;;
对于第二个块,三接受一个函数和一个 int 并将其应用于 Church_of_int 的返回函数。
因此,类型为:
('a -> 'b) -> int -> 'b = <fun>
顶层说:
val three : ('a -> 'a) -> 'a -> 'a = <fun>
3) 第三块
three (fun x -> x + 1) 0;;
在这里,我们将一个函数和一个 int 应用于三个。
我们需要计算
church_of_int 3 (fun x -> x + 1) 0
church_of_int 3 = fun f x -> church_of_int 2 f (f x)
church_of_int 2 = fun f x -> church_of_int 1 f (f x)
church_of_int 1 = fun f x -> church_of_int 0 f (f x)
church_of_int 0 = fun f x -> x
那么
church_of_int 1 = fun f x -> ((fun f x -> x) f (f x)) = fun f x -> f x
church_of_int 2 = fun f x -> ((fun f x -> f x) f f(x)) = fun f x -> f (f x)
church_of_int 3 = fun f x -> ((fun f x -> f (f x)) f f(x)) = fun f x -> f (f (f x))
因此,
church_of_int 3 (fun x -> x + 1) 0 = 3
Toplevel 确认这是正确的。
4) 第四块
three three (fun x -> x + 1) 0;;
这里变得非常混乱。一方面,我们知道three (fun x -> x + 1) 0 = 3
然后
三3是偏应用
另一方面,顶层返回 27。
你能帮我改正我的错误和我的思维过程以获得正确的类型和结果吗?
【问题讨论】: