我想研究haskell中的类型类。我写了下面的脚本,并提出了一个错误。我无法理解为什么编译器将v视为具体类型,而它只是Boxer类的参数。为什么编译器在下面的haskell代码上出错?
data Box1 a b = Box1 Double a [b]
class Boxer v where
foo :: (v a b) -> Double
instance Boxer (Box1 a b) where
foo (Box1 r s t) = r
它在第7行引发错误:8:
Couldn't match type `v' with `Box1'
`v' is a rigid type variable bound by
the type signature for foo :: v a b -> Double at file1.hs:4:10
Expected type: v a b
Actual type: Box1 a b
Relevant bindings include
foo :: v a b -> Double (bound at file1.hs:7:3)
In the pattern: Box1 r s t
In an equation for `foo': foo (Box1 r s t) = r
Failed, modules loaded: none.
在这种情况下,错误可能是由于压痕 - 在'foo'声明不与'Boxer'类相关联,因此,预计类型的函数'FORALL V A湾v a b - > Double'。除此之外,'实例Boxer(Box1 a b)'不正确 - 它应该是'实例Boxer Box1'。如果'foo'函数与'Boxer'类正确关联,前者将是一个类型错误。 – user2407038
@ user2407038非常感谢。这确实是由于缩进而导致的错误。 但是,请你解释一下,当我创建一个Foldable的实例时,那里的编译器不让我做实例Foldable Box1。它要求在Box1上放置更多参数。 –
您必须编写'Foldable(Box1 a)'实例'''Foldable'类需要'* - > *'类的参数,而'Box1'类是'* - > * - > *'。 – user2407038