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

Zac*_*ach 3 haskell functional-programming

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

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

如果我这样做tell ["abc"] :: Writer [String] (),它会毫无问题地评估,但为什么这是必要的?

Ben*_*son 6

tell的返回类型是不是更宽泛Writer:它使用MonadWriter类型类抽象了一个作家的精神,这些单子.

tell :: MonadWriter w m => w -> m ()
Run Code Online (Sandbox Code Playgroud)

因此,当您tell ["abc"]在没有类型注释的情况下编写时,类型检查器会统一w,[String]但它没有任何要细化的信息m.所以你得到了

tell ["abc"] :: MonadWriter [String] m => m ()
Run Code Online (Sandbox Code Playgroud)

象Haskell 98不支持的约束MonadWriter施加到具体类型的参数等[String],所以上述不上有效的Haskell 98.车削FlexibleContexts语言的扩展使得能够对这种类型的支撑.

由于Writer w是的实例MonadWriter w(当w是的一个实例Monoid),tell的主要类型可以专门用来Writer.这就是为什么当你给它Writer类型注释时它工作的原因.

tell :: w -> Writer w ()
Run Code Online (Sandbox Code Playgroud)