4

假设我们有一个非常简单的模型:

Station至少有一个至少Train
Train有两个Station

该模型必须允许检查任何给定的火车访问了哪些车站,并检查哪些火车访问了特定的车站。

如何在 Haskell 中建模?


我是 Haskell 新手,所以请纠正我:创建对象后,您无法修改它 - 您只能基于该对象创建一个新对象(~不变性)。我对吗?如果是这样,我将不得不使用半初始化对象创建大量临时变量(在反序列化期间甚至在单元测试中)。

基本上我需要的是在 Haskell 中建模域类的示例 - 在阅读“Learn you a haskell..”之后,我仍然不知道如何使用这种语言。

4

1 回答 1

4

这是一个天真的方法:

data Station = Station Train [Train]
data Train = Train Station Station [Station]

您永远不必创建未初始化的对象。例如,这里有几个示例值:

grandCentral = Station regional [national]
bestWestern  = Station regional [national]
regional = Train grandCentral bestWestern []
national = Train grandCentral bestWestern []

但是,这种方法有很多缺点。从 Haskell 的纯子集中观察堆内循环是不可能的,因此更新或使用这些数据很棘手。通常的解决方法是显式地为您的指针建模。

type TrainMap   = Map TrainId Train
type StationMap = Map StationId Station
type TrainId    = Int -- use newtype for more compiler checks at
type StationId  = Int -- the cost of more programmer annoyance
data Train   = Train StationId StationId [StationId]
data Station = Station TrainId [TrainId]
于 2012-04-09T17:25:46.397 回答