繁体   English   中英

然后将状态Monad(>>)

[英]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.StrictState实际上只是一个类型同义词:

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 smonad转换器 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

现在,由于xin子句中不起作用,您实际上可以使用snd来获取s ,因此可以将其重写为:

m >> k = \r -> k $ snd m r

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM