如果有这样的函数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
。
我们通常说它需要两个,但从类型系统的角度来看,只有一个参数(一对)。