ML currying和匿名函数

时间:2015-06-10 02:42:10

标签: sml currying

有人可以向我解释这三个绑定中发生了什么吗? 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));

1 个答案:

答案 0 :(得分:4)

函数(fn x => fn y => x)constant function。它需要两个参数(xy)并始终返回第一个参数(即x)。

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

  1. a中,常量函数应用于(g 0)(g 7)
  2. b中,常量函数应用于(g 0)(g "happy")
  3. c中,常量函数应用于(g 0)(g (g 7))
  4. 在所有三种情况下,结果都是(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的返回类型。因此,它是一个多态函数,它比c更通用。
    2. c的类型为(int -> int) -> int,因为g已应用于自己的结果(即g已应用于(g 7))。因此,其返回类型必须与其参数类型相同(即int)。
    3. 因此,ac更通用,c的每个实例都可以安全地替换为a,但反之亦然。