Haskell中的指针相等?

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 嗯,是的,如果你引入荒谬或无限递归,那就是你的错. (3认同)
  • 但"同样的功能"究竟意味着什么呢?(\ x - > x)与(\ x - > x)功能相同.与((\ xy - > y)x)等函数相同.我认为您需要的是一个额外的数据来跟踪解释语言中函数的"地址".模拟a - >(Int,a)余代数的monad可能是有序的. (2认同)

eph*_*ent 9

指针相等会破坏参照透明度,所以NO.

也许令人惊讶的是,实际上可以紧凑空间上计算总函数的扩展相等性,但一般情况下(例如,可能非终止的整数上的函数)这是不可能的.


编辑:我正在为另一种语言创建一个翻译

你可以保留原始程序AST或源位置以及你已经翻译成的Haskell函数吗?看来你想要基于此的"平等".

  • 我很确定"扩展相等"和"紧凑拓扑"这两个短语不是常用术语. (3认同)
  • @Otto:这些短语一般是关于函数的计算相等性,因此它们适用于所有语言.它们不是特定于Haskell的. (2认同)
  • 如果您正在为另一种语言实现解释器,那么只需为每个函数提供唯一的标识符.例如:将{data Function = Function {args :: ArgList,expr :: Expression}更改为{data Function = Function {args :: ArgList,expr :: Expression,uniqueid :: Int}}并通过实例化顺序分配id (2认同)

Cap*_*Fim 5

==要求事物得出方程式

实际上(==)需要一个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'
Run Code Online (Sandbox Code Playgroud)

这可能有帮助吗?

  • 我想你的意思是'x == x'`? (2认同)