为什么有些OCaml函数将()作为参数?

时间:2010-08-16 15:30:26

标签: ocaml

Unix模块中的示例:

val environment : unit -> string array

为什么不呢:

val environment : string array

3 个答案:

答案 0 :(得分:19)

因为它表示一个以单元类型的值作为参数的函数。单位类型仅包含值“()”。这通常用于表示函数将执行某种IO或引起副作用,并且不需要输入。您提供的第二种类型签名是值的签名,而不是可以应用的函数。如果某个表达式绑定到此名称,那么将在值绑定发生时计算该表达式,而不是在引用它时(与函数应用程序的情况一样)。

答案 1 :(得分:4)

单元()参数类似于C中的void参数。它表示不使用其参数来计算某些内容的函数。

在您的示例中,程序可以更改环境,因此它不能只是在程序开头计算的静态值,但同时,它的值不依赖于其参数。

例如:

let e1 = Unix.environment ();;
Unix.putenv "USER" "somebody_else";;
let e2 = Unix.environment ();;
e1 = e2;;

您可以看到e1e2不同,因此Unix.environment不能只是(string * string) array类型,而是需要成为一个函数。

答案 2 :(得分:0)

如果你是一个懒惰的语言,比如Haskell,没有副作用,只有在需要的时候才会评估对象,就不需要这些伪参数。

在OCaml中,要求类型为unit的参数(其唯一值为())用于冻结计算,直到提供参数为止。在这种情况下,它冻结计算直到计算Unix.environment () - 这一点尤其重要,因为它可以在整个时间内具有不同的值(同样,OCaml也有副作用)。