12

Haskell中有指针质量的概念吗?== 需要导出 Eq 的东西,我有一些包含 (Value -> IO Value) 的东西,而且 -> 和 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
4

6 回答 6

13

编辑:给定您的示例,您可以使用 IO monad 对其进行建模。只需将您的函数分配给 IORefs 并进行比较。

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
于 2009-11-11T22:38:07.643 回答
9

指针相等会破坏引用透明度,所以不。

也许令人惊讶的是,实际上可以计算紧凑空间上的总函数的外延相等,但一般来说(例如,可能不终止的整数上的函数)这是不可能的。


编辑:我正在为另一种语言创建解释器

您可以将原始程序 AST 或源位置与您翻译成的 Haskell 函数一起保留吗?看来您想要基于此的“平等”。

于 2009-11-11T20:06:36.543 回答
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'

这可能有帮助吗?

于 2009-11-11T21:06:24.357 回答
3

IORefs 推导出方程式。我不明白你还需要什么来获得指针相等性。

编辑:比较指针相等性唯一有意义的是可变结构。但是正如我上面提到的,可变结构,如 IORefs,已经实例化了 Eq,它可以让您查看两个 IORefs 是否是相同的结构,这正是指针相等。

于 2009-11-11T19:47:38.517 回答
3

我正在为另一种确实具有指针相等性的语言创建一个解释器,所以我试图对这种行为进行建模,同时仍然能够使用 Haskell 函数对闭包进行建模。

我很确定,为了编写这样的解释器,你的代码应该是单子的。您不必维护某种环境或状态吗?如果是这样,您还可以为函数闭包维护一个计数器。因此,每当您创建一个新的闭包时,您都会为其配备一个唯一的 ID。然后对于指针等价,您只需比较这些标识符。

于 2009-11-15T16:19:51.527 回答
3

另一种方法是利用 StableNames。

但是,除非您想滥用 unsafePerformIO,否则 special 必须在 IO monad 中返回其结果。

IORef 解决方案在整个结构的构建过程中都需要 IO。Checking StableNames 仅在您要检查引用相等时使用它。

于 2009-11-16T17:56:01.923 回答