gpt4 book ai didi

haskell - 我如何在 Traveler 实现中最好地表达这种关系

转载 作者:行者123 更新时间:2023-12-01 22:25:38 25 4
gpt4 key购买 nike

我正在整合 Traveler 实现,并首先定义我的数据结构。我在尝试定义 Ship 时遇到了问题。我从一些简单的数据定义开始。

data Ship = Ship Cargo Hull Weapons Engines

data Cargo = WholeMagilla
| MostOfIt
| HalfOfIt
| SomeOfIt

data Hull = Heavy
| AboveAverage
| Average
| Meh

data Weapons = WarMonger
| BadMofo
| CautiousCarl
| Pacifist

data Engines = WarpSuperFast
| WarpFairlyFast
| WarpFast
| Turtle

现在这是我的问题。我想根据其他类型的值来限制类型的值。示例:可能的船舶可能是

Ship WholeMagilla Heavy Pacifist Turtle
Ship WholeMagilla Meh WarMonger Turtle
Ship WholeMagilla Meh Pacifist WarpSuperFast

因此,如果玩家有足够的信用,他们充其量可以拥有两种类型的最大值,但代价是最小化其余的。然后,还有介于两者之间的所有可能性。我开始可视化一个图表,其路径由该路径中已有的节点决定。这可以帮助我思考问题,但不能帮助我编写一个获得我想要的结果的函数。有人能指出我正确的方向吗?

最佳答案

您可以将“积分”关联到您的对象并使用智能构造函数。然后,将所有内容包装在一个模块中,并仅导出智能构造函数,而不导出 Ship 构造函数,这样用户就不会错误地使用它。

这是代码(为了简单起见,我已经剥离了您的构造函数):

data Ship = Ship Cargo Hull deriving Show  

class Credit a where
credit :: a -> Int

instance Credit Cargo where
credit WholeMagilla = 1
credit MostOfIt = 2

instance Credit Hull where
credit Heavy = 1
credit AboveAverage = 2

data Cargo = WholeMagilla
| MostOfIt deriving Show

data Hull = Heavy
| AboveAverage deriving Show

max_credit :: Int
max_credit = 3

ship :: Cargo -> Hull -> Ship
ship c h
| credit c + credit h < max_credit = Ship c h
| otherwise = error "Too many credits"

main :: IO ()
main = do
print $ ship WholeMagilla Heavy
print $ ship WholeMagilla AboveAverage

关于haskell - 我如何在 Traveler 实现中最好地表达这种关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12098908/

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