Haskell:'告诉[“abc”]'评估抛出“非类型变量参数”错误

时间:2017-01-09 00:59:18

标签: haskell functional-programming

当我尝试评估GHCI中的tell ["abc"]时,它会吐出这个错误:

Non type-variable argument
        in the constraint: MonadWriter [[Char]] m
      (Use FlexibleContexts to permit this)

如果我tell ["abc"] :: Writer [String] (),它会毫无问题地进行评估,但为什么还有必要?

1 个答案:

答案 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 wMonadWriter w的实例(当wMonoid的实例时),tell的主要类型可以专门用于{ {1}}。这就是为什么当你给它Writer类型注释时它起作用。

Writer