【发布时间】:2013-05-13 13:02:23
【问题描述】:
我很难理解 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实例。学习如何为特定类实现“只是一些实例”没有什么意义,您更想做的是设计一种数据类型以适应各种类的要求。或者,你为某个问题设计了一个数据类型,突然注意到“嘿,这个东西的行为很像Statemonad。也许它应该是MonadState的一个实例”? – 通常情况下,Monad*类不需要这样做,只需使用合适的转换器堆栈即可。 -
以
newtype Foo s a = Foo (s -> (s, a))开头。
标签: haskell monads ghc monad-transformers state-monad