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

Seo*_*ong 1 function sml

如果有这样的函数foo

fun foo() = 10
Run Code Online (Sandbox Code Playgroud)

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

val bar = foo
Run Code Online (Sandbox Code Playgroud)

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

所以我试过这样:

val int bar = foo
Run Code Online (Sandbox Code Playgroud)

但它会出错。所以我试过这样:

fun foo x = 10

val bar = foo 0
Run Code Online (Sandbox Code Playgroud)

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

那么,我应该怎么做才能在不改变任何东西的情况下运行零参数函数?

mol*_*ilo 5

您可能正在考虑其他一些语言,其中()意味着空参数列表。
在 SML 中,它没有。

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

- fun foo () = 10;
val foo = fn : unit -> int
Run Code Online (Sandbox Code Playgroud)

如您所见,foo是一个从unit到的函数int

- ();
val it = () : unit
Run Code Online (Sandbox Code Playgroud)

()(通常发音为“unit”)是该unit类型的唯一值。
(“单元”一词可以表示“单个事物”,这正是类型的含义。)

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

- foo ();
val it = 10 : int
Run Code Online (Sandbox Code Playgroud)

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

- val kittens = ();
val kittens = () : unit
- foo kittens;
val it = 10 : int
Run Code Online (Sandbox Code Playgroud)

旁注:如果你比较,你可能会认为这很奇怪,比如,

- fun bar (x,y) = x + y;
val bar = fn : int * int -> int
Run Code Online (Sandbox Code Playgroud)

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