Почему некоторые функции OCaml принимают () в качестве параметра? - PullRequest
16 голосов
/ 16 августа 2010

Пример в модуле Unix:

val environment : unit -> string array

Почему бы просто:

val environment : string array

?

Ответы [ 3 ]

19 голосов
/ 16 августа 2010

Потому что это обозначает функцию, которая принимает значение типа type в качестве параметра.Тип блока заселяется только значением "()".Это обычно используется для обозначения того, что функция выполняет какой-то ввод-вывод или вызывает побочный эффект и не требует ввода.Указанная вами подпись второго типа - это подпись для значения, а не функция, которую можно применить.Если какое-либо выражение было связано с этим именем, это выражение будет оцениваться во время связывания значения, а не во время обращения к нему (как в случае с применением функции).

4 голосов
/ 18 февраля 2012

Параметр unit () аналогичен параметру void в C. Он обозначает функцию, которая не использует свой аргумент для вычисления чего-либо.

В вашем примере среда может быть изменена программой, поэтому она не может быть просто статическим значением, вычисленным в начале программы, но в то же время ее значение не зависит от аргумента.

Например:

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

И вы можете видеть, что e1 и e2 различны, поэтому Unix.environment не может просто иметь тип (string * string) array, но должен быть функцией.

0 голосов
/ 30 марта 2013

Если бы вы работали на ленивом языке, таком как Haskell, без побочных эффектов и объектов, оцениваемых только при необходимости, эти фиктивные аргументы не понадобились бы.

В OCaml требуется аргументтип unit (единственное значение которого ()) служит для остановки вычислений до тех пор, пока не будет передан аргумент.В этом случае он останавливает вычисление до тех пор, пока не будет вычислено Unix.environment (), что особенно важно, поскольку он может принимать разные значения во времени (опять же, у OCaml есть побочные эффекты).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...