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 程序吗?那是介于完全注释和未注释之间吗?
(除了唯一有点相关问题 https://stackoverflow.com/questions/14865734/referential-transparency-with-polymorphism-in-haskell我发现这一定还有别的东西)
我不认为有任何保证评估多态类型表达式,例如5
对于“兼容”的任何合理定义,不同类型都会产生“兼容”结果。
GHCi 会议:
> class C a where num :: a
> instance C Int where num = 0
> instance C Double where num = 1
> num + length [] -- length returns an Int
0
> num + 0 -- GHCi defaults to Double for some reason
1.0
这看起来打破了引用透明度,因为length []
and 0
应该是平等的,但在幕后它是num
它被用于不同的类型。
Also,
> "" == []
True
> [] == [1]
False
> "" == [1]
*** Type error
人们可以预料到的False
在最后一行。
因此,我认为引用透明度仅在指定确切类型来解决多态性时才有效。 System F 中的显式类型参数应用程序可以始终用变量的定义替换变量,而不改变语义:据我了解,GHC 在优化过程中内部正是这样做的,以确保语义不受影响。事实上,GHC Core 具有可传递的显式类型参数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)