Чтобы лучше понять монады, я пытаюсь написать свои собственные. Я начинаю с некоторого не монадического кода и могу использовать некоторую помощь, переводя его в монаду.Haskell: перевод на Monad
Основная идея этого надуманного примера: для каждого целочисленного результата вычисления я хотел бы отслеживать, является ли это целое четным или нечетным. Например, в 4 + 5 = 9
мы можем вернуть (9, Odd)
.
Я хотел бы иметь возможность связывать/составлять вычисления с помощью >>=
. Например:
return 1 >>= (+2) >>= (+5) >>= (+7) =result=> (15, Odd)
Прямо сейчас, у меня есть следующий, не монадический код:
data Quality = Odd | Even deriving Show
qual :: Integer -> Quality
qual x = case odd x of
True -> Odd
_ -> Even
type Qualifier = (Integer, Quality)
mkQ :: Integer -> Qualifier
mkQ x = (x, qual x)
plusQ :: Qualifier -> Qualifier -> Qualifier
plusQ (x, _) (y, _) = (x+y, qual (x+y))
chain = plusQ (mkQ 7) . plusQ (mkQ 5) . plusQ (mkQ 2)
Какие способами я могу перевести приведенный выше код в монады? Каковы некоторые из шаблонов, которые я должен искать, и каковы общие шаблоны переводов для них?
Большое спасибо заранее!
Это не легко допускает монадический перевод. Монады параметризуются типом и имеют смысл для любого типа. Вычисление Yor имеет смысл только для intrgers. –
Кажется, вы пытаетесь моделировать преобразования/действия состояния, где ваше состояние в этом случае является «качеством». Вы захотите посмотреть на [** State Monad **] (http://learnyouahaskell.com/for-a-few-monads-more), где ваша государственная монада параметризуется с помощью 'Quality' и ваших операций' (+1) 'превратится в действия государства. – aaronlevin
@ н.м.Хороший момент, и тот, о котором я начинал видеть и удивляться. Что может быть лучшим примером простого, общего процесса, который бы соответствовал этому упражнению? –