我正在尝试学习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
?我根本不理解它,但我有一种强烈的感觉,我在这里错过了一些东西。
答案 0 :(得分:3)
这是一个社区维基的答案,总结了评论的要点:
同样的事情:Writer a
是WriterT a Identity
的类型同义词。此外,writer
实际上是:writer :: Monad m => (a, w) -> WriterT w m a
。在您的情况下m
= Identity
,a
= Maybe String
和w
= [String]
。