Mik*_*uel 8 ocaml tuples currying
注意,在Caml中,最好对多参数函数使用Curried函数定义,而不是元组.
比较'a -> 'b -> 'c
调用约定时'a * 'b -> 'c
.
使用SML/NJ时,我习惯于使用元组类型进行输入和输出:('a * 'b) -> ('c * 'd)
因此使用元组表示多个输入似乎与表达多个输出的方式对称.
为什么curous推荐用于OCaml函数声明而不是元组参数?是否允许currying/partial评估带来更大的灵活性,还是从OCaml编译器的实现细节中获得了一些其他好处?
我认为很多是惯例 - OCaml中的标准库函数是curry,而在Standard ML中它们通常不是除了一些高阶函数.然而,语言中存在一个区别:运算符(例如(*)
)在OCaml中被curry(例如int -> int -> int
); 而它们在标准ML中不受限制(例如op*
可以(int * int) -> int
).正因为如此,内置的高阶函数(例如折叠)也采用了在OCaml中进行干扰并且在标准ML中不受影响的函数; 这意味着你的函数可以使用它,你需要遵循各自的约定,然后从那里开始.
是的,主要是符号的方便性和部分应用的灵活性。柯里化函数在 OCaml 中是惯用的,编译器可能会比元组函数更好地优化它们(而 SML 编译器通常针对元组进行优化)。
元组的优点是您提到的参数/结果对称性(这在编写函数时特别有用),也许还有符号熟悉性(至少对于来自非函数世界的人来说)。