Haskell 哈斯克尔:';告诉[“abc”]&x27;“评估投掷”;“非类型变量参数”;错误

Haskell 哈斯克尔:';告诉[“abc”]&x27;“评估投掷”;“非类型变量参数”;错误,haskell,functional-programming,Haskell,Functional Programming,当我尝试在GHCI中计算告诉[“abc”]时,它会抛出以下错误: Non type-variable argument in the constraint: MonadWriter [[Char]] m (Use FlexibleContexts to permit this) 如果我真的告诉你:[abc]::Writer[String](),它的求值是没有问题的,但为什么这是必要的呢?tell的返回类型比Writer的返回类型更为通用:它用写的精神来抽象所有单子

当我尝试在GHCI中计算
告诉[“abc”]
时,它会抛出以下错误:

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

如果我真的告诉你:[abc]::Writer[String](),它的求值是没有问题的,但为什么这是必要的呢?

tell
的返回类型比
Writer
的返回类型更为通用:它用写的精神来抽象所有单子

tell :: MonadWriter w m => w -> m ()
因此,当您在没有类型注释的情况下编写
tell[“abc”]
时,类型检查器会将
w
[String]
统一起来,但它没有任何可用于优化
m
的信息。所以你得到了

tell ["abc"] :: MonadWriter [String] m => m ()
Haskell 98不支持应用于具体类型参数(如
[String]
)的约束(如
MonadWriter
),因此上述约束无效。启用可启用对此类类型的支持

由于
Writer w
MonadWriter w
的一个实例(当
w
Monoid
的一个实例时),
tell
的主要类型可以专门用于
Writer
。这就是为什么当您为它提供
Writer
类型注释时,它会起作用

tell :: w -> Writer w ()

在这个场景中,
m()
是具体的类型吗?是什么告诉编译器m有一种
(*->*)
,而不是
(*->*->*)
?另外,你能澄清一下“主体类型”是什么意思吗?没有特别的顺序:1)“主体类型”只是“最一般类型”的另一种说法。2) 类型签名的无效部分是
MonadWriter[String]m
<代码>[String]是一个具体的类型,而不是类型变量,Haskell 98要求约束的参数始终是类型变量。3) 类型检查器知道
m::*->*
,因为a)它应用于类型表达式
m()
中的一个参数,b)它用作
MonadWriter::*->(*->*)->约束的第二个参数