Я пытаюсь написать программу игры Haskell «номер угадать», используя Монады, но я stucked:
Я попробовал простое состояние монады:Монада кортежей (монада, штат)?
data SM a = SMN (S -> (a, S))
instance Monad SM where
SMN c1 >>= fc2 = SMN (\s0 -> let (r, s1) = c1 s0 in
let SMN c2 = fc2 r in
c2 s1)
И мне нужно для выполнения задач ввода-вывода на «IO стороне» кортежа (а, S), то есть, я пытался делать что-то вроде:
SMN c1 >>= fc2 = SMN (\s0 -> let (r, s1) = c1 s0 in
let SMN c2 = fc2 r in
let (r1, s2) = c2 s1 in
let r2 = r1 >>= (\_ -> r) in
(r2, s2))
Короче говоря, оператор привязки Я хотел бы определить так же, как в исходном состоянии монады , за исключением того, что мы связываем r1 и константную функцию, которая принимает аргумент в r (так что эти два действия скованы ее). Но ghc говорит мне, что a - жесткая переменная типа ... Что это значит? Я не могу использовать другой оператор привязки внутри одного оператора привязки?
Если да, то есть ли способ реализовать такой оператор связывания? Как?
Как я новичок в Haskell (я думаю, что, возможно, имел нотационную ошибку относительно функции
\_ -> r
), любое мнение и ссылки приветствуются, спасибо заранее.
P.S. Я использовал разные обозначения для типа данных SM и конструктора типов SMN, чтобы их отличить.
Код очень запутанный. Не могли бы вы объяснить, что именно вы пытаетесь сделать? Для меня это звучит так, как будто вы пытаетесь построить нечто вроде «StateT s IO a». Вы можете найти варианты этого в 'Control.Monad.Trans.State.Strict' и' Control.Monad.Trans.State.Lazy'. Но я не могу сказать точно, потому что я не понимаю ваш код. – dfeuer
@dfeuer Я хотел бы разделить действие монады и запись состояния в двух частях кортежа: (monad, state), чтобы я мог вызвать fst и snd, когда это необходимо, чтобы отделить их и выполнить некоторые подходящие действия. Я не знаю, как объяснить это явно, возможно, после того, как я завершу код, я могу показать использование этой монады, и тогда будет ясно, что я пытаюсь построить здесь. – awllower