OCaml中的参考透明度

时间:2011-05-22 22:43:26

标签: 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的引用是透明的,还是我错过了什么?

2 个答案:

答案 0 :(得分:6)

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

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

部分Expressions (but not statements)例如说OCaml is a purely functional languageOCaml claims to be stateless。第Omissions节说

  

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

这很有趣,因为如果它们没用,就不会将循环添加到Ocaml中。

答案 1 :(得分:1)

参照透明度意味着函数的上下文不会影响结果,而“纯”函数是仅依赖于其参数且没有副作用的函数。例如在

# 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时它不会改变)但是不纯。