在Haskell中实现简单的业务模型

时间:2012-04-09 16:47:24

标签: haskell data-modeling

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

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

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

如何在Haskell中对其进行建模?


我是Haskell的新手,所以请纠正我:一旦创建了一个对象,你就无法修改它 - 你只能根据那个创建一个新对象(〜不变性)。我对吗?如果是这样, 我将不得不使用半初始化对象创建大量临时变量(在反序列化期间甚至在单元测试期间)。

基本上我需要的是在Haskell中建模域类的一个例子 - 在阅读“了解你一个haskell ......”后,我仍然不知道如何使用这种语言。

1 个答案:

答案 0 :(得分: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]