也许是Monad变换器将Writer改为WriterT

时间:2016-03-16 11:32:53

标签: haskell monad-transformers

我正在尝试学习monad变形金刚,并且在找到一个问题的解释时遇到问题。

说,我创建一个像这样的作家(在ghci中):

let w =  writer (Just "value", ["log"]) :: Writer [String] (Maybe String)

现在我想把它包装在MaybeT monad变换器中。 MaybeT构造函数具有以下类型:

:t MaybeT
m (Maybe a) -> MaybeT m a

并且,基于此,使用MaybeT调用w的结果应该具有以下类型:

MaybeT (Writer [String]) String

但事实并非如此:

let mt = MaybeT w
:t mt
MaybeT (WriterT [String] Data.Functor.Identity.Identity) String

我的问题是,为什么ghci会将Writer [String]替换为WriterT [String] Identity?我根本不理解它,但我有一种强烈的感觉,我在这里错过了一些东西。

1 个答案:

答案 0 :(得分:3)

这是一个社区维基的答案,总结了评论的要点:

同样的事情:Writer aWriterT a Identity的类型同义词。此外,writer实际上是:writer :: Monad m => (a, w) -> WriterT w m a。在您的情况下m = Identitya = Maybe Stringw = [String]