这个状态类单子的一个好名字是什么?

7

这有点像是 StateWriter 的结合体。我已经检查了单子法则。

newtype M s a = M { runM :: s -> (s,a) }

instance (Monoid s) => Monad (M s) where
    return = M . const . (mempty,)
    m >>= f = M $ \s -> 
        let (s' ,x) = runM m s
            (s'',y) = runM (f x) (s `mappend` s')
        in (s' `mappend` s'', y)

StateWriter 看起来有点弱。


conat?我本来期望是 return a = M.flip (,) a 或者类似的东西。 - ephemient
为什么 >>= 没有产生 (s \mappend` s' `mappend` s'', y)`?我对返回的幺半群有点困惑。 - rampion
@rampion:使用s mappend s' mappend s''会意味着当f = return() >> return() >> return()时,runThing f "hello"将返回类似于("hellohellohello", ())的内容,对吗? - Axman6
@Axman6:而 runM f "hello" where f = return () >> return () >> return () 目前是 ("", ()),这对我来说也有点困惑。 - rampion
1
@rampion,它是writer和state的组合。它返回从计算中生成的状态的部分。 - luqui
3个回答

3
“内省式写作软件”?看起来它与“写作软件”相比,最有趣的功能是编写一个内省函数来检查状态/输出并进行更改:
introspect :: (s -> s) -> M s ()
introspect f = M $ \s -> (f s, ()) 

我觉得你需要使用一个后置转换器,而不是为作家做这件事情:

postW :: Writer w a -> (w -> w) -> Writer w a
postW ma f = Writer $ let (w,a) = getWriter ma in (f w,a)

这不是 censor :: MonadWriter w m => (w -> w) -> m a -> m a (来自 Control.Monad.Writer.Class) 的作用吗? - Ed'ka
1
@Ed'ka - 是的,postW和censor是相同的。但它们都是“后转换器”,对“日志”(w->w)的操作必须与单个writer-monad操作配对。使用introspect,您可以在复合单调表达式中将其与(>>)链接。 - stephen tetley

2

Monoidal State. MonoState.MState. AccumState.


1
AccumState很好,也许可以改为StateAccum。至少这符合我的需求。 - luqui

0

或许称之为 SW(有状态写入器),我认为短名称更加直观且可以节省一些打字时间。


2
类型 SW a b = LongerAndMoreDescriptiveName a b - rampion
@rampion:myFunctionWithVeryLongAndExtremelyDescriptiveName :: Integer -> SomeExtremelyComplicatedDatatypeWhereThisIsTheLongestNameIcanThinkOf -> LongAndDescriptiveMonadT LongerAndMoreDescriptiveName a b 这就是为什么我喜欢短名字——节省打字量。对于那些不理解名称的人:RTMF :) - fuz
1
读他妈的论文(或者读函数珍珠 :-)) - luqui
1
@luqui:哈哈哈,你说对了。这就是我感受到的。(例如,当我阅读一些文档时,比如“根据某篇论文和某位教授的箭头”,没有网址,只有边缘信息与其他内容相比。) - fuz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接