我试图将参考透明度的定义与OCaml处理多态类型和副作用的方式协调起来。我在https://web.archive.org/web/20120729232358/http://www.csc.villanova.edu/~dmatusze/resources/ocaml/ocaml.html上阅读到,如果定义的含义不依赖于它所处的上下文,则称其为具有参考透明度。OCaml中的函数具有参考透明度,也就是说,更改上下文(其他变量和其他函数)不会更改已经定义的任何函数的含义。由于您可能经常重新定义函数,因此这一事实在调试程序时非常关键。
但是,据我所理解,这在OCaml中不可能是真的,因为在返回给定输出之前,它可能执行大量的副作用(例如写入文件和执行其他计算)。
您可能拥有一个函数
例如,
所以,OCaml是参考透明的吗?还是我理解有误?
但是,据我所理解,这在OCaml中不可能是真的,因为在返回给定输出之前,它可能执行大量的副作用(例如写入文件和执行其他计算)。
您可能拥有一个函数
f:string -> string
,使得f"a"
不等于f"a"
。我们可以在函数体中插入一些副作用表达式,这些表达式在f
的类型描述中完全看不见。例如,
f
可以被定义为返回某个文件的第一行。上下文中的某个函数可能会更改影响f
返回的第一行。或者更糟糕的是,上下文中的某个函数可能会删除f
依赖的文件,这将使f
未定义。所以,OCaml是参考透明的吗?还是我理解有误?