Python 如何在Haskell中模拟对象标识的概念

Python 如何在Haskell中模拟对象标识的概念,python,haskell,interpreter,Python,Haskell,Interpreter,我正在考虑在Haskell中为类似Python的面向对象语言设计一个解释器。我面临的一个特殊问题与对象标识的概念有关。如果我们考虑Python的IDObjt函数,则定义表明它返回对象的标识。这是一个整数或长整数,保证该对象在其生存期内唯一且恒定。两个生命周期不重叠的对象可能具有相同的id值。实现说明:这是对象的地址 在Haskell中实现这样一个概念的一般方法是什么 我假设您的解释器将在状态monad中工作。很可能这个州将由一组活的物体和诸如此类的东西组成。您可以做的是跟踪可用的未使用id列表(

我正在考虑在Haskell中为类似Python的面向对象语言设计一个解释器。我面临的一个特殊问题与对象标识的概念有关。如果我们考虑Python的IDObjt函数,则定义表明它返回对象的标识。这是一个整数或长整数,保证该对象在其生存期内唯一且恒定。两个生命周期不重叠的对象可能具有相同的id值。实现说明:这是对象的地址


在Haskell中实现这样一个概念的一般方法是什么

我假设您的解释器将在状态monad中工作。很可能这个州将由一组活的物体和诸如此类的东西组成。您可以做的是跟踪可用的未使用id列表(表示为Int),并用Int(即其id)注释每个对象。此id取自可用id列表,并在创建时分配给它。因此,两个对象实例不能具有相同的id

注意,我谈到了Ints。你可以选择整数,但最终效率可能会降低。使用Ints确实意味着您必须将已销毁对象的id添加回可用id的池列表中,否则最终会耗尽。因此,我设想如下:

data Object a = Obj Int a

instance Eq (Object a) where
  Obj i _ == Obj j _ = i == j

type InterpreterState a = State [Int] a

createObject :: a -> InterpreterState (Object a)
createObject a = do
  (i:is) <- get 
  put is
  return $ Obj i a 

destroyObject :: Object a -> InterpreterState ()
destroyObject (Obj i a) = do
  modify (i:)
data VariableContent = Int | String | ObjRef Int | ...
data ObjStore = ObjStore [(Int, Object)]
data ProgramState = ProgramState ObjStore VariableStore ...

请注意,在您的情况下,解释器状态要复杂得多,createObject和destroyObject应该将对象添加到状态中或从状态中删除。但这不是重点。

这个问题的答案取决于您将如何实现这些您想要从中获取id的对象。如果两个变量包含同一个对象,情况会如何?基本上,您需要在变量中存储对可变对象的引用,问题是如何准确地做到这一点。如果只将简单值与变量名关联,那么一个变量中的更改将永远不会反映在另一个变量中,也不会有对象标识这样的事情

因此,变量需要保存对对象的实际当前值的引用。这可能是这样的:

data Object a = Obj Int a

instance Eq (Object a) where
  Obj i _ == Obj j _ = i == j

type InterpreterState a = State [Int] a

createObject :: a -> InterpreterState (Object a)
createObject a = do
  (i:is) <- get 
  put is
  return $ Obj i a 

destroyObject :: Object a -> InterpreterState ()
destroyObject (Obj i a) = do
  modify (i:)
data VariableContent = Int | String | ObjRef Int | ...
data ObjStore = ObjStore [(Int, Object)]
data ProgramState = ProgramState ObjStore VariableStore ...
这里,每个ObjRef引用ObjStore中的一个值,该值可由存储在ObjRef中的Int id访问。这个Int是idobject函数返回的正确值

通常,id函数很大程度上取决于实际实现对象引用的方式