Я пытаюсь согласовать определение ссылочной прозрачности с тем, как 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 ссылочно прозрачен или я что-то упустил?