我对Haskell有点陌生,而且我对“国家单曲”有一些麻烦。
我已经创建了以下类型。Stat a有一个为它创建的一元、函子、应用程序和单实例。
在我的程序中,“主要”类型是“生物”,它有许多论点:
data Creature = Creature {
strength :: Stat Integer,
dexterity :: Stat Integer,
...
}
data Stat a = Stat {
modifiers :: [StatModifier],
stat :: a
}
data StatModifier = StatModifier {
modifierType :: ModifierType,
value :: Integer
}
data ModifierType =
Enhancement
| Morale
| ...有很多事情会发生在一个生物身上。我选择用“国家单子”来代表这些东西:
anyPossibleChange :: State Creature Creature这可能是对生物造成的伤害,增加了生物的力量,基本上是任何东西。任何事情的可能性都让我觉得国家的单子在这里是个不错的选择。我将接受处于原始状态的生物,执行一些修改,并以元组的形式返回原始状态和新状态。
最初的状态可能是:
Creature {
strength = Stat [] 10,
dexterity = Stat [] 10
}结束状态可能是:
Creature {
strength = Stat [StatModifier Enhancement 2] 10,
dexterity = Stat [StatModifier Enhancement 4, StatModifier Morale 2] 10
}我想建立一个名单,所有的改变,一个生物需要通过,然后运行的生物通过所有这些变化。
这是我想要的签名,但是我想不出一个实现。我对此持开放态度。
applyChanges :: Creature -> [State Creature Creature] -> Creature我觉得我应该可以用折叠式(可能是FoldM )来完成这个任务,但我的大脑正被这些类型所困扰。
什么是好的实施?
发布于 2017-05-26 15:32:29
State Creature Creature是这种计算的错误类型。正如您所看到的,您可以不使用它,但是它不必要地使事情复杂化,因为您实际上根本不关心状态变量!您只需使用它来存储函数的原始input...but,然后将其丢弃在applyChanges中。
一个更容易使用的类型是Creature -> Creature,然后如果您有要应用的这些函数的列表,那么您只需要组合它们,就可以使用折叠:
applyChanges :: [Creature -> Creature] -> Creature -> Creature
applyChanges = foldr (.) idhttps://stackoverflow.com/questions/44193347
复制相似问题