Sml ML curry和匿名函数
有人能给我解释一下这三种装帧是怎么回事吗? 帕伦夫妇的意义是什么?g的含义是什么?为什么在匿名函数中作为参数必须是g?总的来说,这一切到底发生了什么。。。谢谢大家!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)
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
,但反之亦然