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 次 |
最近记录: |