用面向对象的语言编写模拟,每个对象都有一个标识——也就是说,一种将它与模拟中的每个其他对象区分开来的方法,即使其他对象具有完全相同的属性。一个对象保留它的身份,无论它随着时间的推移发生多少变化。这是因为每个对象在内存中都有一个唯一的位置,我们可以用指针或引用来表达那个位置。即使您不强加像 GUID 这样的附加身份系统,这也有效。(您经常会这样做以支持不考虑指针的网络或数据库之类的东西。)
我不相信 Haskell 中有一个等效的概念。那么,标准方法是使用 GUID 之类的东西吗?
更新以澄清问题:身份是我的问题域中的一个重要概念,原因有一个:对象之间存在关系,必须保留这些关系。例如,Haskell 通常会说红色汽车是红色汽车,并且所有红色汽车都是相同的(假设颜色是汽车的唯一属性)。但是,如果每辆红色汽车都必须与它的主人联系起来呢?如果车主可以重新粉刷他的汽车呢?
综合答案的最终更新:共识似乎是,如果模拟的某些部分实际使用这些标识符,您应该只向数据类型添加标识符,并且没有其他方法可以表达相同的信息。例如,对于一个人拥有多个汽车的情况,每个汽车都有一个颜色,一个人可以保留一个不可变汽车的列表。只要您有权访问 Person,这充分表达了所有权关系。
Person 可能需要也可能不需要某种唯一标识符。发生这种情况的一种情况是:有一个函数接受 Car 和所有 Person 的集合,并将 ParkingTicket 强加给适当的 Person。汽车的颜色不能唯一地识别获得票的人。所以我们可以给 Person 一个 ID 并让 Car 存储它。
但即使是这种情况,也可以通过更好的设计来避免。也许我们的汽车现在有一个类型为 ParkingPosition 的附加属性,可以将其评估为合法或非法。因此,我们将 Person 集合传递给一个函数,该函数查看每个 Person 的 Cars 列表,检查每个人的 ParkingPosition,并在适当的情况下将 ParkingTicket 强加给那个 Person。因为这个函数总是知道它在看哪个 Person,所以 Car 不需要记录那个信息。
因此,在许多情况下,分配 ID 并不像最初看起来那样必要。