SML`o`运算符仅对单参数函数有用吗?

Gre*_*egT 15 ml sml smlnj

o组合物操作者(例如val x = foo o bar,其中foobar是两个功能),仅在单参数的函数和/或功能可用与参数相等数量?如果没有,是什么,比如说,组成语法foo(x,y)bar(x).

Tay*_*can 17

正如Michael已经说过的那样,SML只有单个参数函数.不过,我想详细说明一下.

以下功能:

fun foo (x,y) = x + y
Run Code Online (Sandbox Code Playgroud)

有类型:

fn : int * int -> int
Run Code Online (Sandbox Code Playgroud)

这意味着第一个参数是两个整数的元组.所以你可以这样做:

(sign o foo) (4,~5)
Run Code Online (Sandbox Code Playgroud)

哪个会给你相同的sign (foo (4,~5)).

好的,但这样的事情怎么样?

fun bar x y = x + y
Run Code Online (Sandbox Code Playgroud)

它有类型:

fn : int -> int -> int
Run Code Online (Sandbox Code Playgroud)

这意味着bar实际上只需要一个整数,并返回一个函数.所以你不能这样做:

(sign o bar) 4 ~5
Run Code Online (Sandbox Code Playgroud)

因为bar返回一个函数,而sign是一个整数.但是你可以这样做:

(sign o bar 4) ~5
Run Code Online (Sandbox Code Playgroud)

因为bar 4是一个为数字加4的函数.

  • 如果你定义了一个`uncurry`函数来帮助你使用`sign o bar`来帮助你的最后一个"问题",也可能还有一个`flip`函数可以通过翻转'(x,y)`来翻转"参数排序" `(y,x)`等 (2认同)

Mic*_*ber 7

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