如何在SML中“运行”零参数函数

时间:2017-04-11 10:47:19

标签: function sml

如果有这样的函数 foo

fun foo() = 10

当我想运行 foo 时,我写的是这样的:

val bar = foo

bar 成为一个函数(unit-> int)而不是10

所以我试过这样:

val int bar = foo

但它会造成错误。所以我试着这样:

fun foo x = 10

val bar = foo 0

最后我得到 bar = 10,但它看起来很糟糕。

那么,我应该怎么做运行零参数函数而不做任何改变?

1 个答案:

答案 0 :(得分:4)

您可能会想到其他一些语言,其中()表示空参数列表 在SML中,它没有。

foo不接受零参数;它只需要一个参数:()

- fun foo () = 10;
val foo = fn : unit -> int

如您所见,foounitint的函数。

- ();
val it = () : unit

()(通常发音为“unit”)是unit类型的唯一值。
(“单位”一词可以表示“单一的东西”,这正是类型的所在。)

要调用该函数,请为其传递unit类型的参数:

- foo ();
val it = 10 : int

您当然也可以将名称绑定到()

- val kittens = ();
val kittens = () : unit
- foo kittens;
val it = 10 : int

附注:如果你比较,

,你可能会觉得这很奇怪
- fun bar (x,y) = x + y;
val bar = fn : int * int -> int

bar也只接受一个int * int类型的参数 我们通常它需要两个,但从类型系统的角度来看,只有一个参数(这是一对)。