В качестве задания мне нужно работать с монадами в Haskell и создавать игровую игру, в которой есть одно простое правило: бросить 6 монет, подсчитать головы, бросить кубик и если его результат равен или больше, чем количество голов, которые вы считаете побежденным, иначе вы проиграете. Я получил следующее «рамки», ограничивающую Игорный Монадой:Haskell: Работа с классами монады
data Coin = H | T
deriving (Bounded, Eq, Enum, Ord, Show)
data Dice = D1 | D2 | D3 | D4 | D5 | D6
deriving (Bounded, Eq, Enum, Ord, Show)
data Outcome = Win | Lose
deriving (Eq, Ord, Show)
class Monad m => MonadGamble m where
toss :: m Coin
roll :: m Dice
game :: MonadGamble m => m Outcome
game = undefined
Однако я еще новичок в монад, и я понятия не имею, как работать с ними. Например: определение игры должно реализовать игру, описанную выше, но как мне работать с этой Монархией азартных игр, чтобы, например, выполнить один или несколько бросков (-ов)/ролл (ы) и получить результирующие значения, Я могу использовать/работать с ними?
Также из моего понимания у Монады всегда есть две функции по умолчанию: return and (>> =), но я не вижу, как это применимо к монаде MonadGable?
Если кто-нибудь может мне помочь, это очень ценится!
С уважением, Skyfe.
Вы можете написать всю логику игры, не имея реализацию 'MonadGamble', а затем вы можете написать« экземпляр MonadGamble some_existing_monad, где ... », чтобы получить фактическое поведение, в котором оно выполняется. – bheklilr
Просто, чтобы быть ясным: в Haskell «тип» представляет собой (примерно) набор значений. «Класс» (несколько менее грубо) представляет собой набор типов (а не набор значений). Таким образом, «MonadGamble» представляет собой набор типов, каждый из которых имеет операции '>> =' и 'return', а также операции' MonadGamble' 'toss' и' roll'. –