也许 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 a
是 WriterT a Identity
的类型同义词。此外,writer
实际上是:writer :: Monad m => (a, w) -> WriterT w m a
。在你的情况下 m
= Identity
, a
= Maybe String
和 w
= [String]
.
我正在尝试学习 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 a
是 WriterT a Identity
的类型同义词。此外,writer
实际上是:writer :: Monad m => (a, w) -> WriterT w m a
。在你的情况下 m
= Identity
, a
= Maybe String
和 w
= [String]
.