如果有这样的函数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,但它看起来很糟糕。
那么,我应该怎么做才能在不改变任何东西的情况下运行零参数函数?
您可能正在考虑其他一些语言,其中()意味着空参数列表。
在 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。
我们通常说它需要两个,但从类型系统的角度来看,只有一个参数(一对)。