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。它有两个参数(xy)并且总是 return 第一个参数(即 x)。

此函数应用于所有三个函数中的两个参数 abc:

  1. a中,常量函数应用于(g 0)(g 7)
  2. b中,常量函数应用于(g 0)(g "happy")
  3. 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

尽管函数 ac 具有相同的结果,但它们的类型不同:

  1. a的类型是(int -> 'a) -> 'a,因为我们不知道函数g的return类型。因此,它是一个多态函数,比 c.
  2. 更通用
  3. c 的类型是 (int -> int) -> int 因为 g 应用于它自己的结果(即 g 应用于 (g 7))。因此,它的 return 类型必须与其参数类型相同(即 int)。

因此,ac 更通用,c 的每个实例都可以安全地替换为 a,但反之则不然。