o
组合运算符(例如val x = foo o bar
,其中foo
和bar
都是函数),仅适用于单参数函数和/或函数相同数量的论点?如果没有,那么使用foo(x,y)
撰写bar(x)
的语法是什么。
答案 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
周围非常有用。