为什么编译器会在以下 haskell 代码中出错?
why does the compiler give error on the following haskell code?
我正在尝试研究 haskell 中的 classes 类型。我编写了以下脚本并引发了错误。我无法理解为什么编译器将 v 视为具体类型,而它只是 class Boxer 的参数。
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.
在您的实例中,编译器必须用 Box1 a b
实例化 v
。特别是,它必须用 (Box1 a b) a b
之类的东西来实例化 v a b
——除了两个 a
变量都来自不同的地方;他们实际上被消歧为 (Box1 a b) a1 b1
。与 Box1 a b a1 b1
.
相同
foo :: Box1 a b a1 b1 -> Double
这有意义吗?
问题是您将 (类型)函数,即 Box1
与 结果 混淆了将所述函数应用于某些类型参数。 种类不匹配:
GHCi> :k Boxer
Boxer :: (* -> * -> *) -> Constraint
GHCi> :k (Box1 Int String)
Box1 Int String :: *
* -> * -> *
是那种有两个参数的类型函数/类型构造函数,所以这就是 Boxer
所需要的。而 Box1 a b
只是一个类型,没有参数。不匹配!哦,
GHCi> :k Box1
Box1 :: * -> * -> *
特定问题是由不正确的缩进引起的。尽管还有一件事我做错了。于是编译出以下版本:
data Box1 a b = Box1 Double a [b]
class Boxer v where
foo :: (v a b) -> Double
instance Boxer Box1 where
foo (Box1 r s t) = r
我正在尝试研究 haskell 中的 classes 类型。我编写了以下脚本并引发了错误。我无法理解为什么编译器将 v 视为具体类型,而它只是 class Boxer 的参数。
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.
在您的实例中,编译器必须用 Box1 a b
实例化 v
。特别是,它必须用 (Box1 a b) a b
之类的东西来实例化 v a b
——除了两个 a
变量都来自不同的地方;他们实际上被消歧为 (Box1 a b) a1 b1
。与 Box1 a b a1 b1
.
foo :: Box1 a b a1 b1 -> Double
这有意义吗?
问题是您将 (类型)函数,即 Box1
与 结果 混淆了将所述函数应用于某些类型参数。 种类不匹配:
GHCi> :k Boxer
Boxer :: (* -> * -> *) -> Constraint
GHCi> :k (Box1 Int String)
Box1 Int String :: *
* -> * -> *
是那种有两个参数的类型函数/类型构造函数,所以这就是 Boxer
所需要的。而 Box1 a b
只是一个类型,没有参数。不匹配!哦,
GHCi> :k Box1
Box1 :: * -> * -> *
特定问题是由不正确的缩进引起的。尽管还有一件事我做错了。于是编译出以下版本:
data Box1 a b = Box1 Double a [b]
class Boxer v where
foo :: (v a b) -> Double
instance Boxer Box1 where
foo (Box1 r s t) = r