有人可以向我解释这三个绑定中发生了什么吗? parens有什么意义? g的含义是什么?为什么它必须是一个g作为匿名函数中的参数?总的来说,这一切实际上发生了什么......谢谢!
val a = fn g => (fn x => fn y => x) (g 0) (g 7);
val b = fn g => (fn x => fn y => x) (g 0) (g "happy");
val c = fn g => (fn x => fn y => x) (g 0) (g (g 7));
答案 0 :(得分:4)
函数(fn x => fn y => x)
是constant function。它需要两个参数(x
和y
)并始终返回第一个参数(即x
)。
此函数适用于所有三个函数a
,b
和c
中的两个参数:
a
中,常量函数应用于(g 0)
和(g 7)
。b
中,常量函数应用于(g 0)
和(g "happy")
。c
中,常量函数应用于(g 0)
和(g (g 7))
。在所有三种情况下,结果都是(g 0)
,因为第二个参数被丢弃。因此,所有这三个功能都可以简化为:
val a = fn g => g 0
val b = fn g => g 0
val c = fn g => g 0
实际上,第二个函数(即b
)会引发类型错误,因为g
首先应用于int
,然后应用于string
。
虽然函数a
和c
具有相同的结果但它们的类型不同:
a
的类型为(int -> 'a) -> 'a
,因为我们不知道函数g
的返回类型。因此,它是一个多态函数,它比c
更通用。c
的类型为(int -> int) -> int
,因为g
已应用于自己的结果(即g
已应用于(g 7)
)。因此,其返回类型必须与其参数类型相同(即int
)。因此,a
比c
更通用,c
的每个实例都可以安全地替换为a
,但反之亦然。