也许 monad 转换器将 Writer 更改为 Writer

MaybeT monad transformer changing Writer to WriterT

我正在尝试学习 monad 转换器,但遇到问题无法找到一个问题的解释。

说,我像这样创建一个编写器(在 ghci 中):

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

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

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

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

MaybeT (Writer [String]) String

但事实并非如此:

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

我的问题是,为什么 ghci 将 Writer [String] 替换为 WriterT [String] Identity?我完全不明白,但我有一种强烈的感觉,我在这里遗漏了一些东西。

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

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