【发布时间】:2013-01-19 09:04:03
【问题描述】:
o 组合运算符(例如val x = foo o bar,其中foo 和bar 都是函数)是否仅可用于单参数函数和/或具有相同数量参数的函数?如果不是,那么将foo(x,y) 与bar(x) 组合在一起的语法是什么。
【问题讨论】:
o 组合运算符(例如val x = foo o bar,其中foo 和bar 都是函数)是否仅可用于单参数函数和/或具有相同数量参数的函数?如果不是,那么将foo(x,y) 与bar(x) 组合在一起的语法是什么。
【问题讨论】:
我见过一些标准 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 是非常有用的。
【讨论】:
正如 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 的函数。
【讨论】:
uncurry 函数来帮助解决您使用sign o bar 的最后一个“问题”,还可能还有一个flip 函数可以通过翻转@987654333 对来翻转“参数排序” @到(y,x)等
sign $ bar x y。
SML 只有单参数函数; foo(x,y) 是一个函数 foo 采用单个参数,元组 (x, y)。因此,不需要特殊处理,bar(x) 将需要返回一个适当类型的元组来与foo 组合它。
【讨论】: