Я ищу, чтобы пройти государственную монады через следующие функции:Связывание вычислений с государственной монадой?
e1 :: Int -> (Bool, Int)
e1 el
| el > 100 = (True, el)
| otherwise = (False, 0)
e2 :: Int -> (Bool, Int)
e2 el
| el > 200 = (True, el)
| otherwise = (False, 0)
e3 :: Int -> (Bool, Int)
e3 el
| el > 300 = (True, el)
| otherwise == (False, 0)
implementor :: State Bool Int
implementor = state e1 ...
main = do
print $ runState implementor 10
В настоящее время runState
передается в State s a
(implementor
) и значение (10), а затем возвращая кортеж из e1
.
Однако я хотел бы связать эти операции вместе, такие как:
state e1 >>= e2 >>= e3
e1
пройдет его State Bool Int
в e2
, который будет работать на Int
(через el
), а затем передать это в результате State Bool Int
к e3
, который, опять же, будет работать на Int
в этом состоянии.
Я нашел экземпляр Monad государства очень запутанным, после this руководства:
instance Monad (State s) where
return :: state $ \s -> (s, a)--this is returning a State which contains function (s -> (s, a))
m >>= k = state $ \s -> let (a, s') = runState m s --?
in runState (k a) s'
Я не понимаю, что это пример привязки делает и как использовать это, чтобы связать e1
, e2
и e3
вместе?
Вы ищете «состояние e1 >> состояние e2 >> состояние e3'? – Zeta
@Zeta Я добавил к своему вопросу для ясности –
Err, 'state e1' is __not__ a State Bool Int', но' State Int Bool'. – Zeta