Sml ML curry和匿名函数

Sml ML curry和匿名函数,sml,currying,Sml,Currying,有人能给我解释一下这三种装帧是怎么回事吗? 帕伦夫妇的意义是什么?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的含义是什么?为什么在匿名函数中作为参数必须是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)
是。它接受两个参数(
x
y
),并始终返回第一个参数(即
x

此函数应用于所有三个函数
a
b
c
中的两个参数:

  • a
    中,常量函数应用于
    (g0)
    (g7)
  • b
    中,常量函数应用于
    (g0)
    (g“happy”)
  • c
    中,常量函数应用于
    (g0)
    (g7))
  • 在这三种情况下,结果都是
    (g0)
    ,因为第二个参数被丢弃。因此,所有这三个功能都可以简化为:

    val a = fn g => g 0
    val b = fn g => g 0
    val c = fn g => g 0
    
    实际上,第二个函数(即
    b
    )会引发类型错误,因为
    g
    首先应用于
    int
    ,然后应用于
    字符串

    虽然函数
    a
    c
    具有相同的结果,但它们的类型不同:

  • a
    的类型是
    (int->'a)->'a
    ,因为我们不知道函数
    g
    的返回类型。因此,它是一个多态函数,比
    c
    更通用
  • c
    的类型是
    (int->int)->int
    ,因为
    g
    应用于它自己的结果(即
    g
    应用于
    (g7)
    )。因此,其返回类型必须与参数类型相同(即
    int
  • 因此,
    a
    c
    更一般,并且
    c
    的每个实例都可以安全地替换为
    a
    ,但反之亦然。

    函数
    (fn x=>fn y=>x)
    是。它接受两个参数(
    x
    y
    ),并始终返回第一个参数(即
    x

    此函数应用于所有三个函数
    a
    b
    c
    中的两个参数:

  • a
    中,常量函数应用于
    (g0)
    (g7)
  • b
    中,常量函数应用于
    (g0)
    (g“happy”)
  • c
    中,常量函数应用于
    (g0)
    (g7))
  • 在这三种情况下,结果都是
    (g0)
    ,因为第二个参数被丢弃。因此,所有这三个功能都可以简化为:

    val a = fn g => g 0
    val b = fn g => g 0
    val c = fn g => g 0
    
    实际上,第二个函数(即
    b
    )会引发类型错误,因为
    g
    首先应用于
    int
    ,然后应用于
    字符串

    虽然函数
    a
    c
    具有相同的结果,但它们的类型不同:

  • a
    的类型是
    (int->'a)->'a
    ,因为我们不知道函数
    g
    的返回类型。因此,它是一个多态函数,比
    c
    更通用
  • c
    的类型是
    (int->int)->int
    ,因为
    g
    应用于它自己的结果(即
    g
    应用于
    (g7)
    )。因此,其返回类型必须与参数类型相同(即
    int
  • 因此,
    a
    c
    更一般,并且
    c
    的每个实例都可以安全地替换为
    a
    ,但反之亦然