如果有这样的函数 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,但它看起来很糟糕。
那么,我应该怎么做运行零参数函数而不做任何改变?
答案 0 :(得分:4)
您可能会想到其他一些语言,其中()
表示空参数列表
在SML中,它没有。
foo
不接受零参数;它只需要一个参数:()
。
- fun foo () = 10;
val foo = fn : unit -> int
如您所见,foo
是unit
到int
的函数。
- ();
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
类型的参数
我们通常说它需要两个,但从类型系统的角度来看,只有一个参数(这是一对)。