[英]State Monad then (>>)
我想知道>>
在Haskell状态monad中的定义。
以我的猜测,它会将一种状态传递给另一种状态:
(>>) :: State s a -> State s b -> State s b
State a >> State b = State $ \x -> b $ snd ( a x )
要么
State a >> State b = State $ b . snd . a
这个对吗?
你说的很对。 >>
实际上比您建议的要笼统,但是您可以将其与您指定的类型签名一起使用。 如果您使用的State
从它的平常家庭, Control.Monad.Trans.State.Strict
,或它的家外之家, Control.Monad.State.Strict
, State
实际上只是一个类型同义词:
type State s = StateT s Identity
其中Identity
来自Data.Functor.Identity
并已定义
newtype Identity x = Identity x
和StateT
被定义
newtype StateT s m a = StateT {runStateT :: s -> m (a, s)}
所以State sa
只是周围的新型包装
s -> Identity (a, s)
这基本上与您想象的定义相同,但是它允许State s
与monad转换器 StateT s
兼容,后者用于将状态添加到任意Monad
。
instance Monad m => Monad (StateT s m) where
return a = StateT $ \s -> return (a, s)
StateT g >>= f = StateT $ \s -> g s >>= \(r,s') -> runStateT (f r) s'
所以
StateT g >> StateT h = StateT $ \s -> g s >>= \(_,s') -> h s'
= StateT $ \s -> h $ snd $ runIdentity (g s)
= StateT $ h . snd . runIdentity . g
StateT
的定义使我StateT
烦恼,因为我认为它使成对的元素以错误的顺序排列。 为什么错了? 因为在映射(a, s)
的变化s
,同时留下a
孤独,是不是发生了什么时,超过的状态转换映射。 最终结果:直觉不佳。
我认为这个Wikipedia页面为State
monad提供了(>>=)
的定义:
m >>= f = \r -> let (x, s) = m r in (f x) s
由于(>>)
是按照(>>=)
,如下所示:
m >> k = m >>= \_ -> k
可以得出状态monad的(>>)
定义:
m >> k = \r -> let (x, s) = m r in ((\_ -> k) x) s
或消除噪音时:
m >> k = \r -> let (x, s) = m r in k s
现在,由于x
在in
子句中不起作用,您实际上可以使用snd
来获取s
,因此可以将其重写为:
m >> k = \r -> k $ snd m r
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.