16

o组合运算符(例如val x = foo o bar,wherefoo和are 两个函数)是否bar仅可用于单参数函数和/或具有相同数量参数的函数?如果不是,例如foo(x,y)bar(x).组成的语法是什么?

4

3 回答 3

17

正如迈克尔已经说过的,是的,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 的函数。

于 2013-02-04T19:14:17.057 回答
7

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

于 2013-02-04T16:07:17.333 回答
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

于 2013-03-15T15:52:54.103 回答