我知道这是可以改变包装类型,这样就可以有是否可以改变monadic序列中的monad类型?
f :: (a -> m b)
g :: (b -> m c)
f >>= g :: (a -> m c)
但有可能改变m
?如果m
是MonadError
并且由Either ErrorA
和Either ErrorB
实现,我可以以某种方式链接它们吗?显然我不能直接链接它们,因为Left
的类型是什么?不过,我在我结束了在这两种情况下调用show
的情况,但我还没有发现比
case mightFail1 of
Left e -> show e
Right v -> either show doStuff mightFail2
一个更好的解决方案,它不能正确使用在第一个错误停止的单子行为,而不我必须明确检查。
正如J. Abrahamson的回答所说,这是两个单子之间的自然转换,也称为**单体态射**。有几个软件包来支持这个和类似的概念; Tekmo的[mmorph'包](http://www.haskellforall.com/2013/03/mmorph-100-monad-morphisms.html)上有一篇博客文章,您可以尝试阅读。然而,总的来说,我认为两个monad之间的态度可能需要有一些访问每个monad的“胆量”来在它们之间进行转换。 –