我對Haskell有點新鮮,而且我在國家monad方面遇到了一些麻煩。Haskell - 我將如何運行狀態單子列表?
我已經創建了以下類型。 Stat a
有爲它創建的monoid,functor,applicative和monad實例。
「主」式的在我的計劃是動物,它有很多爭論:
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
這可能是破壞正在做生物,增加對生物的實力,基本上什麼。任何事情的可能性都讓我覺得國家monad在這裏是個不錯的選擇。我將接受一個處於原始狀態的生物,執行一些修改,並將原始狀態和新狀態返回到一個元組中。
原來的狀態可能是:
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
但我的大腦是越來越掛了周圍的類型。
一個好的實現會是什麼?
什麼是開始狀態?列表爲空時應該發生什麼?你的'生物'是'Monoid'嗎? – Bergi
我編輯了我的問題,並添加了一個開始和結束狀態的示例以及一些更多類型的說明。這是我生物的簡化版本,真實的東西不是幺半羣。如果列表是空的,我想我會期待回到原來的生物。 –
我看到的問題是您提出的'applyChanges'函數不接受處於原始狀態 – Bergi