Haskell语言在引用透明性方面提供了什么确切的承诺/保证?至少Haskell报告没有提及此概念。
考虑表达
(7^7^7`mod`5`mod`2)
我想知道此表达式是否为1。为了安全起见,我将执行两次:
( (7^7^7`mod`5`mod`2)==1, [False,True]!!(7^7^7`mod`5`mod`2) )
现在提供(True,False)
了GHCi 7.4.1。
显然,此表达式现在是参照不透明的。如何判断程序是否受到此类行为的影响?我可以::
遍历整个程序,但这并不能使其可读性强。我错过了其他类的Haskell程序吗?那是在完全注释的和未注释的之间?
(除了我在SO上发现的唯一有点相关的问题之外,此上还必须包含其他内容)
问题是超载,的确确实违反了参照透明性。您不知道(+)
Haskell的情况如何;这取决于类型。
当Haskell程序中不受限制的数字类型时,编译器将使用默认的类型来选择一些合适的类型。这是为了方便起见,通常不会导致任何意外。但是在这种情况下确实引起了意外。在ghc中,您可以-fwarn-type-defaults
用来查看编译器何时使用默认值为您选择类型。您也可以将行添加default ()
到模块中以停止所有默认设置。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句