Unix模块中的示例:
val environment : unit -> string array
为什么不呢:
val environment : string array
答案 0 :(得分:19)
因为它表示一个以单元类型的值作为参数的函数。单位类型仅包含值“()”。这通常用于表示函数将执行某种IO或引起副作用,并且不需要输入。您提供的第二种类型签名是值的签名,而不是可以应用的函数。如果某个表达式绑定到此名称,那么将在值绑定发生时计算该表达式,而不是在引用它时(与函数应用程序的情况一样)。
答案 1 :(得分:4)
单元()
参数类似于C中的void
参数。它表示不使用其参数来计算某些内容的函数。
在您的示例中,程序可以更改环境,因此它不能只是在程序开头计算的静态值,但同时,它的值不依赖于其参数。
例如:
let e1 = Unix.environment ();;
Unix.putenv "USER" "somebody_else";;
let e2 = Unix.environment ();;
e1 = e2;;
您可以看到e1
和e2
不同,因此Unix.environment
不能只是(string * string) array
类型,而是需要成为一个函数。
答案 2 :(得分:0)
如果你是一个懒惰的语言,比如Haskell,没有副作用,只有在需要的时候才会评估对象,就不需要这些伪参数。
在OCaml中,要求类型为unit
的参数(其唯一值为()
)用于冻结计算,直到提供参数为止。在这种情况下,它冻结计算直到计算Unix.environment ()
- 这一点尤其重要,因为它可以在整个时间内具有不同的值(同样,OCaml也有副作用)。