Haskell中是否存在指针质量的概念? ==要求事物得到Eq,我有一些东西包含(值 - > IO值),而且没有 - >也不是IO派生公式
编辑:我正在为另一种语言创建一个解释器, 具有指针相等性,所以我试图模拟这种行为,同时仍然能够使用Haskell函数来模拟闭包。编辑:示例:我想要一个能够执行此操作的函数special
:
> let x a = a * 2
> let y = x
> special x y
True
> let z a = a * 2
> special x z
False
答案 0 :(得分: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
答案 1 :(得分:9)
指针等式会破坏referential transparency,所以NO。
也许令人惊讶的是,在possible上计算extensional equality总函数实际上是compact spaces,但一般情况下(例如,可能没有终止的整数上的函数)这是不可能的。
编辑:我正在为另一种语言创建翻译
您是否可以保留原始程序AST或源位置以及您已将其翻译成的Haskell函数?看来你想要基于它的“平等”。
答案 2 :(得分:5)
==要求事物得出Eq
实际上(==)
需要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'
这有帮助吗?
答案 3 :(得分:3)
IORefs派生出Eq。我不明白你需要什么来获得指针相等的。
编辑:比较指针相等性的唯一事情是可变结构。但正如我上面提到的,可变结构,如IORefs,已经是实例Eq,它允许你看看两个IORef是否是相同的结构,这正是指针相等。
答案 4 :(得分:3)
我正在创建一个解释器 确实有另一种语言 指针相等,所以我正在努力 在仍然存在时模拟这种行为 能够使用Haskell函数进行建模 闭包。
我很确定为了编写这样的解释器,你的代码应该是monadic。你不必保持某种环境或状态吗?如果是这样,您还可以维护一个函数闭包计数器。因此,每当您创建一个新的闭包时,您都会为它配备一个唯一的ID。然后,对于指针等效,您只需比较这些标识符。
答案 5 :(得分:3)
另一种方法是利用StableNames。
但是,除非你想滥用unsafePerformIO,否则特殊必须在IO monad中返回其结果。
IORef解决方案在整个结构构建过程中需要IO。当您想要检查引用相等性时,检查StableNames只会使用它。