首页 文章

OCaml中的参考透明度

提问于
浏览
3

我试图调整引用透明度的定义与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

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

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

    Expressions (but not statements)节例如说 OCaml is a purely functional languageOCaml claims to be stateless . 第_2393169节说

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

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

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

相关问题