当前位置:  开发笔记 > 编程语言 > 正文

交换内部和外部单子

如何解决《交换内部和外部单子》经验,为你挑选了1个好方法。

如何转换StateT g (Either E) TExceptT E (StateT g Identity) T

也许,一些混合traversehoist也许会有帮助.



1> Benjamin Hod..:

你无法交换任意一对monad.但你可以交换这两个特殊的monad.如果你newtype在那些monad变换器的定义中扩展s,这是最容易理解的.

特定

newtype StateT s m a = StateT { runStateT :: s -> m (s, a) }

newtype ExceptT e m a = ExceptT { runExceptT :: m (Either e a) }

扩展newtype你的第一个类型表达式中的s给了我们同构

StateT s (Either e) a   <->   s -> Either e (s, a)

而我们得到的第二个

ExceptT e (StateT s Identity) a   <->   s -> (s, Either e a)

请注意,Either e (s, a)可能包含或不包含s,但(s, Either e a)总是如此.现在,只需通过traverse函数内部的元组就可以从后者转到前者,但是另一种方式需要一些特定于域的推理:如果计算抛出错误,那么我们应该将状态通过不变地传递给捕获器错误.(这是正确的做法吗?我觉得它很有争议.)

stateTEitherToExceptTState :: (s -> Either e (s, a)) -> (s -> (s, Either e a))
stateTEitherToExceptTState f s =
    case f s of
         Left e -> (s, Left e)
         Right sa -> fmap Right sa

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有