SML中的`o`运算符只适用于单参数函数吗?

16

o组合操作符(如val x = foo o bar,其中foobar都是函数),只能用于单参数函数和/或参数数量相等的函数吗? 如果不是,那么如何将foo(x,y)bar(x)组合起来的语法是什么。

3个回答

16

正如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的函数。


2
如果你定义了一个 uncurry 函数来帮助解决 sign o bar 的最后一个“问题”,并且可能还有一个 flip 函数,可以通过翻转 (x,y) 对来翻转“参数顺序”到 (y,x) 等。 - Jesper.Reenberg
Jesper:在这种情况下,我可能会定义一个$运算符,并执行sign $ bar x y - Tayacan

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

4
我曾经看到一些标准ML代码(特别是Poly/ML代码Isabelle/Pure),将额外的组合运算符放入顶层环境中来处理这种情况。例如:
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 是非常有用的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接