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] (),它会毫无问题地评估,但为什么这是必要的?
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)
| 归档时间: |
|
| 查看次数: |
107 次 |
| 最近记录: |