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>