我正在尝试学习Monad Transformers,基于标准的Haskell库(mtl?transformers?不确定哪一个是我下载的Haskell平台 - 7.4.1自带的)。
我认为我已经注意到每个Monad Transformer定义的共同结构:
基本类型(“Base”)
- Monad实例
变换器类型(“BaseT”)
Monad实例
MonadTrans实例
MonadIO实例
变换器类(“MonadBase”)
一些操作
其他“BaseT”的实例
因此,例如对于Writer Monad,将会有:
- Writer数据类型/新类型/类型,带有Monad实例
- WriterT数据类型/新类型/类型,带有Monad,MonadTrans和MonadIO实例
- 一个MonadWriter类,并针对StateT,ReaderT,IdentityT等的此类实例
这就是Monad Transformers的组织方式吗?我错过了什么吗/有任何不正确的细节吗?
这个问题的动机是找出:
- “BaseT”和相应的“MonadBase”和“Base”之间的关系和差异
- 是否需要所有三个
- MonadTrans是如何相关的以及其目的是什么