【发布时间】:2015-03-10 18:37:51
【问题描述】:
我读到(例如 here 和 here)所有基本单子
(Mabye, Error, ...) 派生自它们对应的单子变换器
(MaybeT, ErrorT, ...) 使用身份单子 Identity。一个例子是:
type Maybe a = MaybeT Identity a
但这当然不会导致Maybe a 的构造函数。
而在sourcesMaybeT中定义为newtype MaybeT m a = MaybeT (m (Maybe a))。
我错过了什么重要的东西吗?
如何使用相应的 monad 转换器和 identitiy monad 导出一个基本 monad,从而产生一个具体的
可以匹配的构造函数?
【问题讨论】:
-
Maybe在base中定义,monad 转换器通常来自transformers或mtl之类的库。Errormonad 也来自一个库,还有State、Reader和Writer。在这种情况下,Maybe和MaybeT是奇怪的。 -
MaybeT Identity a等价于Maybe a——它在Identity (Maybe a)附近简化为一个新类型MaybeT——但实际上并不是一回事,部分原因是Maybe被视为首先是数据结构,然后是 monad。 -
"例如
type Maybe a = MaybeT Identity a。" No,但正确的例子是type State s = StateT s Identity。