ML 柯里化和匿名函数
ML currying and anonymous functions
有人可以向我解释一下这三个绑定中发生了什么吗?
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));
函数(fn x => fn y => x)
是constant function。它有两个参数(x
和 y
)并且总是 return 第一个参数(即 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
的return类型。因此,它是一个多态函数,比 c
. 更通用
c
的类型是 (int -> int) -> int
因为 g
应用于它自己的结果(即 g
应用于 (g 7)
)。因此,它的 return 类型必须与其参数类型相同(即 int
)。
因此,a
比 c
更通用,c
的每个实例都可以安全地替换为 a
,但反之则不然。
有人可以向我解释一下这三个绑定中发生了什么吗? 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));
函数(fn x => fn y => x)
是constant function。它有两个参数(x
和 y
)并且总是 return 第一个参数(即 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
的return类型。因此,它是一个多态函数,比c
. 更通用
c
的类型是(int -> int) -> int
因为g
应用于它自己的结果(即g
应用于(g 7)
)。因此,它的 return 类型必须与其参数类型相同(即int
)。
因此,a
比 c
更通用,c
的每个实例都可以安全地替换为 a
,但反之则不然。