Haskell 哈斯克尔:';告诉[“abc”]&x27;“评估投掷”;“非类型变量参数”;错误
当我尝试在GHCI中计算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的返回类型更为通用:它用写的精神来抽象所有单子
告诉[“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::*->(*->*)->约束的第二个参数