SML`o`运算符仅对单参数函数有用吗?

时间:2013-02-04 16:03:01

标签: sml smlnj ml

o组合运算符(例如val x = foo o bar,其中foobar都是函数),仅适用于单参数函数和/或函数相同数量的论点?如果没有,那么使用foo(x,y)撰写bar(x)的语法是什么。

3 个答案:

答案 0 :(得分:17)

正如Michael已经说过的那样,SML只有单个参数函数。不过,我想详细说明一下。

以下功能:

fun foo (x,y) = x + y

有类型:

fn : int * int -> int

这意味着第一个参数是两个整数的元组。所以你可以这样做:

(sign o foo) (4,~5)

哪个会与sign (foo (4,~5))相同。

好的,但是这样的事情呢?

fun bar x y = x + y

它的类型为:

fn : int -> int -> int

这意味着bar实际上只占用一个整数,并返回一个函数。所以你不能这样做:

(sign o bar) 4 ~5

因为bar返回一个函数,而sign是一个整数。但是你可以这样做:

(sign o bar 4) ~5

因为bar 4是一个向数字添加4的函数。

答案 1 :(得分:7)

SML只有单个参数函数; foo(x,y)是一个函数foo,只有一个参数,元组(x, y)。因此,不需要特殊处理,bar(x)将需要返回适当类型的元组以使用foo组合它。

答案 2 :(得分:4)

我见过一些标准ML代码(特别是Poly / ML代码Isabelle / Pure),它将额外的合成运算符放入处理这种情况的顶级环境中。 E.g:

fun (f oo g) x y = f (g x y)
fun (f ooo g) x y z = f (g x y z)
fun (f oooo g) x y z w = f (g x y z w)

一般来说,应该谨慎使用这些东西(四个或更多的东西有点傻),但至少oo周围非常有用。