o
组合操作符(如val x = foo o bar
,其中foo
和bar
都是函数),只能用于单参数函数和/或参数数量相等的函数吗? 如果不是,那么如何将foo(x,y)
与bar(x)
组合起来的语法是什么。
正如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
这意味着该条形图实际上只需要一个整数,并返回一个函数。因此您不能这样做:
(sign o bar) 4 ~5
因为 bar 返回一个函数,而 sign 接受一个整数。不过你可以这样做:
(sign o bar 4) ~5
因为bar 4
是一个将数字加4的函数。
foo(x,y)
是一个以元组(x, y)
为单一参数的函数foo
。因此,不需要特殊处理,bar(x)
需要返回一个适当类型的元组来与foo
组合。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)
通常情况下,这样的东西应该谨慎使用(四个或更多的 o 有点傻),但至少保留 oo
是非常有用的。
uncurry
函数来帮助解决sign o bar
的最后一个“问题”,并且可能还有一个flip
函数,可以通过翻转(x,y)
对来翻转“参数顺序”到(y,x)
等。 - Jesper.Reenbergsign $ bar x y
。 - Tayacan