Cla*_*diu 12 comparison haskell pointers equality
Haskell中是否存在指针质量的概念?==要求事物得到Eq,并且我有一些东西包含(值 - > IO值),而且 - >和IO都没有得到Eq.
编辑:我创建了这另一种语言翻译确实有指针相等,所以我想,同时仍然能够使用Haskell函数模型关闭模型此行为.
编辑:示例:我想要一个special能够执行此操作的函数:
> let x a = a * 2
> let y = x
> special x y
True
> let z a = a * 2
> special x z
False
Apo*_*isp 12
编辑:根据您的示例,您可以使用IO monad对此进行建模.只需将您的功能分配给IORef并进行比较即可.
Prelude Data.IORef> z <- newIORef (\x -> x)
Prelude Data.IORef> y <- newIORef (\x -> x)
Prelude Data.IORef> z == z
True
Prelude Data.IORef> z == y
False
指针相等会破坏参照透明度,所以NO.
也许令人惊讶的是,实际上可以在紧凑空间上计算总函数的扩展相等性,但一般情况下(例如,可能非终止的整数上的函数)这是不可能的.
编辑:我正在为另一种语言创建一个翻译
你可以保留原始程序AST或源位置以及你已经翻译成的Haskell函数吗?看来你想要基于此的"平等".
==要求事物得出方程式
实际上(==)需要一个Eq 实例,不一定是派生实例.您可能需要做的是提供您自己的Eq实例,它只是忽略该(Value -> IO Value)部分.例如,
data D = D Int Bool (Value -> IO Value)
instance Eq D where
  D x y _ == D x' y' _ = x==x && y==y'
这可能有帮助吗?