Sml 在ML的高阶函数中,什么是curry和uncurry

Sml 在ML的高阶函数中,什么是curry和uncurry,sml,higher-order-functions,currying,ml,Sml,Higher Order Functions,Currying,Ml,我了解作曲功能,但不太了解ML中的咖喱和未经加工。有人能解释这些吗 还有,下面两行是什么意思 fun curry f x y = f (x, y); fun uncurry f (x, y) = f x y; fun compose (f, g) x = f (g x); 如果您查看这些类型,您将清楚地看到curry和uncurry的作用 请记住,可以定义将其参数作为一个大元组或多个参数的函数(实际上,它变成了一个函数链,每个函数取一个参数,请参见此): 从它们的类型中可以清楚地看出区别:

我了解作曲功能,但不太了解ML中的咖喱和未经加工。有人能解释这些吗

还有,下面两行是什么意思

fun curry f x y = f (x, y); 
fun uncurry f (x, y) = f x y; 
fun compose (f, g) x = f (g x);

如果您查看这些类型,您将清楚地看到
curry
uncurry
的作用

请记住,可以定义将其参数作为一个大元组或多个参数的函数(实际上,它变成了一个函数链,每个函数取一个参数,请参见此):

从它们的类型中可以清楚地看出区别:

fun foo (a,x) = a*x+10
fun bar a x = a*x+20
curry
函数将一个将其参数作为元组的函数“转换”为一个函数“链”,每个函数接受一个参数。当我们想要组合一系列函数,其中一些函数已经部分应用了参数时,这特别方便。查看如何更改
foo
的类型:

val foo = fn : int * int -> int
val bar = fn : int -> int -> int
现在,我们可以尝试组合两个函数:

- curry foo;
val it = fn : int -> int -> int
第一个4作为参数
x
应用于
bar 1
,然后该计算的结果(
bar 14
)作为
x
参数应用于
foo

显然,
uncurry
用于反向过程:

- (curry foo 5 o bar 1) 4;
val it = 130 : int
- (curry foo 5 o bar 1) 4;
val it = 130 : int
- uncurry bar;
val it = fn : int * int -> int