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