OCaml中的参考透明度

dav*_*k01 3 ocaml side-effects referential-transparency

我试图调整引用透明度的定义与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是透明的透明还是我错过了什么?

ant*_*kos 6

正如您所解释的那样,Ocaml不是引用透明的.

也许Matuszek想要强调Ocaml的功能方面,但在我看来,他误导或者说错了.

例如,段表达式(但不是语句)表示OCaml is a purely functional languageOCaml claims to be stateless.部分遗漏

循环也被省略了,但无论如何它们在纯函数式语言中并不是非常有用.

这很有趣,因为如果没有用,循环就不会被添加到Ocaml中.