Ссылочная прозрачность в OCaml - PullRequest
3 голосов
/ 23 мая 2011

Я пытаюсь согласовать определение ссылочной прозрачности с тем, как OCaml обрабатывает полиморфные типы и побочные эффекты. Я читаю на http://www.csc.villanova.edu/~dmatusze/resources/ocaml/ocaml.html, что

Говорят, что определение имеет ссылочную прозрачность, если его значение не зависит от контекста, в котором оно находится. Функции в OCaml имеют ссылочную прозрачность, то есть изменение контекста (других переменных и других функций) не меняет смысла любые функции, которые вы уже определили. Этот факт может иметь решающее значение при отладке программы, поскольку вы, вероятно, будете переопределять функции довольно часто.

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

Возможно, у вас есть функция f : string -> string, поэтому f "a" не равно f "a". Мы можем добавить некоторые побочные выражения в тело функции, которые полностью невидимы в описании типа f.

В качестве примера можно определить f для возврата первой строки некоторого файла. Где-то в контексте f может быть функция, которая изменяется, что влияет на то, что возвращает первая строка f. Или, что еще хуже, некоторая функция в контексте могла бы удалить файл, от которого зависит f, что сделало бы f неопределенным.

Итак, OCaml ссылочно прозрачен или я что-то упустил?

Ответы [ 2 ]

6 голосов
/ 23 мая 2011

Ocaml не является референтно прозрачным, как вы уже объяснили.

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

Раздел Выражения (но не выражения) Например, говорится, что OCaml is a purely functional language и OCaml claims to be stateless.В разделе Пропуски говорится, что

Петли также были опущены, но в любом случае они не очень полезны для чисто функционального языка.

, которыйзабавно, поскольку петли не были бы добавлены в Ocaml, если бы они не были полезны.

1 голос
/ 13 июня 2011

Ссылочная прозрачность означает, что контекст функции не влияет на результат, в то время как «чистая» функция - это функция, которая зависит только от своих аргументов и не имеет побочных эффектов. Например, в

# let y = 10;;
# let f x = (Printf.printf "%d+%d=%d\n" x y (x+y); x+y);;
val f : int -> int = <fun>
# f 5;;
5+10=15
- : int = 15
# let y = 3;;
val y : int = 3
# f 5;;
5+10=15
- : int = 15

мы видим, что f прозрачно относительно (потому что он не меняется при переопределении y), но нечистый.

...