Мне трудно понять MonadState .
Причина, возможно, в том, что большинство примеров смешиваются с синтаксисом записей в их структуре данных.
Итак, я попытался реализовать MonadState без использования синтаксиса записи.
Следующий код, который я написал, прошел компилятор, но мне он кажется полной ерундой.
Что не так с этим кодом?
Есть ли простой пример реализации MonadState без использования синтаксиса записи?
data Foo a b = Foo (Maybe ([a],b)) deriving (Show)
unwrapFoo :: Foo a b -> Maybe ([a],b)
unwrapFoo (Foo x) = x
instance Monad (Foo [a]) where
return x = Foo $ Just ([], x)
m >>= f = case unwrapFoo m of
Just (_, r) -> f r
Nothing -> Foo Nothing
instance MonadState Int (Foo [a]) where
get = Foo $ Just ([], 1)
put _ = Foo $ Just ([],())
*Main> get :: Foo [a] Int
Foo (Just ([],1))
*Main> put 3 :: Foo [a] ()
Foo (Just ([],()))
*Main>
MonadState
. Нет смысла изучать, как реализовать только какой-то экземпляр для определенного класса, вам скорее нужно разработать тип данных, соответствующий требованиям различных классов. Или вы разрабатываете тип данных для какой-то задачи и вдруг замечаете, что эта штука ведет себя очень похоже на монадуState
. Возможно, это должен быть экземплярMonadState
? – Обычно дляMonad*
классов это делать не нужно, просто используйте подходящий стек трансформатора. - person leftaroundabout   schedule 13.05.2013newtype Foo s a = Foo (s -> (s, a))
. - person dave4420   schedule 13.05.2013