gpt4 book ai didi

haskell - 在 Haskell 中实现这个 OO 概念

转载 作者:行者123 更新时间:2023-12-03 12:59:27 25 4
gpt4 key购买 nike

我需要帮助将 OO 概念翻译成 Haskell。

想象一下 Vehicle类和 CarTruck子类,带有 driveOneMile方法返回一个表示使用的总燃料的 double 值。每次调用driveOneMile也改变了车辆的内部状态。

这是我迄今为止在 Haskell 中所做的(因为 Haskell 中没有实例变量,看来我必须创建自己的“状态”类型):

type CarState = (Double,Double)
initialCarState = (0,0)

driveCarOneMile :: CarState -> (Double,CarState) --Double: total fuel used
driveCarOneMile s = ...


--the internal state of trucks is more complex. needs three Doubles
type TruckState = (Double,Double,Double)
initialTruckState = (0,0,0)

driveTruckOneMile :: TruckState -> (Double,TruckState)
driveTruckOneMile s = ...

以类似的方式,我可以构建其他车辆及其“驱动”功能。

这就是我两次开车的方式:
fuelFor2Miles = fst $ driveCarOneMile $ snd $ driveCarOneMile initialCarState

  • 我这样做正确吗?
  • 如果不是,您将如何纠正?
  • 如何使用上述(或您更正的方法)收集许多汽车、卡车和其他车辆,每辆驾驶 10 次,并获得相应的总燃料使用量 [Double] 列表? (在 OO 中,这很简单,将车辆放入列表中,对每辆车辆调用该方法 10 次,然后将使用的总燃料放入新列表中。)
  • 最佳答案

    Haskell 中的类与 OO 类有很大不同,在大多数情况下使用它们就像编写 OO 代码会使事情变得比应有的更复杂。特别是,一旦您开始考虑用 OO 术语“[采取]许多汽车、卡车和其他车辆的集合”,您就会直接进入兔子洞(如 Haskell Antipattern: Existential Typeclass 所指出的那样)。

    您可能根本不需要一个类来为您的不同类型的车辆建模。你可以定义

    data Vehicle = Car CarState | Truck TruckState

    进而
    driveOneMile :: Vehicle -> (Double, Vehicle)

    使用模式匹配来区分不同的车辆。

    即使您确实需要更多类的东西(例如,您正在编写一个库并希望用户提供他们自己的车辆),但这并不一定意味着您需要异构集合。你可以给 Vehicle单个构造函数,并为其添加与类方法对应的字段,使类成为类型,类实例成为值(这就是反模式文章所提倡的做法)。您可能还有 Vehicle带有 toGeneralVehicle :: a -> GeneralVehicle 的类方法,并具有根据 GeneralVehicle 定义的常见行为类型。

    P.S.:签名背后的想法,如 TruckState -> (Double,TruckState)是健全的。事实上,我想说你无意中发现了 State类型! State只是一个方便的抽象,使状态传递管道隐式。如果您好奇,请查找有关 State 的问题和教程。单子(monad)。

    关于haskell - 在 Haskell 中实现这个 OO 概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23522749/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com