Haskell中的指针相等?

时间:2009-11-11 19:39:42

标签: pointers haskell comparison equality

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

6 个答案:

答案 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只会使用它。