【问题标题】:Implementing simple business model in Haskell在 Haskell 中实现简单的业务模型
【发布时间】:2012-04-10 01:25:46
【问题描述】:

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

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

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

如何在 Haskell 中建模?


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

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

【问题讨论】:

    标签: haskell data-modeling


    【解决方案1】:

    这是一个幼稚的方法:

    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]
    

    【讨论】:

    • 对于Station,您可以使用Station (NonEmpty TrainId),但不幸的是,这对火车没有帮助。
    • @Daniel - 谢谢你的回答。关于您的代码的一些问题:首先,您可以在 Haskell 中对对象进行前向声明吗?其次,当你写regional = Train grandCentral时——grandCentral是对象的referencepointer还是copy?好吧,正如我所说 - 我是 Haskell 的新手,但如果没有合适的方法来模拟现实世界的逻辑/关系,那么我们应该如何使用这种语言?不过我喜欢地图的想法。
    • @elmes 没有前向或后向声明。只有声明。当您编写 regional = Train grandCentral 时,GHC 实现会产生一个 thunk,当评估时,会生成 Train 标记和指向 grandCentral thunk 的指针,无论当时的评估状态是什么 grandCentral。我不确定我是否理解你最后一个问题的假设,即没有合适的方法来模拟现实世界的逻辑/关系;你能更准确地说出你想要什么吗?在什么意义上这是无法实现的?
    • @elmes:您尝试将有关 OOP 及其在命令式编程语言中的实现的知识转移到 Haskell。只是不要那样做,而是忘记你所知道的一切。
    • @NiklasB。是的,你是对的 :-) 我可能需要更多关于如何用 Haskell 编写的示例。我喜欢这种语言的许多方面(语法不是一个)。我需要在 Haskell 中有一个好的 CRUD 示例,带有一些后端逻辑(即在创建阶段)。
    猜你喜欢
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多