当我尝试评估GHCI中的tell ["abc"]
时,它会吐出这个错误:
Non type-variable argument
in the constraint: MonadWriter [[Char]] m
(Use FlexibleContexts to permit this)
如果我tell ["abc"] :: Writer [String] ()
,它会毫无问题地进行评估,但为什么还有必要?
答案 0 :(得分:6)
tell
的返回类型比Writer
更通用:它使用the MonadWriter
type class来抽象所有具有作家精神的monad。
tell :: MonadWriter w m => w -> m ()
因此,当您编写没有类型注释的tell ["abc"]
时,类型检查器会将w
与[String]
统一起来,但它没有任何可用于优化m
的信息。所以你得到了
tell ["abc"] :: MonadWriter [String] m => m ()
Haskell 98不支持像MonadWriter
这样的约束应用于[String]
这样的具体类型参数,因此上面的Haskell 98无效。启用the FlexibleContexts
language extension可以支持这种类型类型。
由于Writer w
是MonadWriter w
的实例(当w
是Monoid
的实例时),tell
的主要类型可以专门用于{ {1}}。这就是为什么当你给它Writer
类型注释时它起作用。
Writer