Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class 为什么编译器在以下haskell代码中给出错误?_Class_Haskell_Instance - Fatal编程技术网

Class 为什么编译器在以下haskell代码中给出错误?

Class 为什么编译器在以下haskell代码中给出错误?,class,haskell,instance,Class,Haskell,Instance,我正在努力学习haskell的类型课程。我编写了下面的脚本,脚本引发了一个错误。我无法理解为什么编译器认为v是一个具体类型,而它只是类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 matc

我正在努力学习haskell的类型课程。我编写了下面的脚本,脚本引发了一个错误。我无法理解为什么编译器认为v是一个具体类型,而它只是类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.

在您的实例中,编译器必须使用
box1ab
实例化
v
。特别是,它必须用类似于
(box1ab)ab
的东西实例化
vab
——除了两个
a
变量来自不同的地方;实际上,它们被消歧为
(box1ab)a1b1
。这与
框1 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
所需要的。而
box1ab
只是一个类型,没有参数。不匹配!奥托

GHCi> :k Box1
Box1 :: * -> * -> *

在您的实例中,编译器必须使用
box1ab
实例化
v
。特别是,它必须用类似于
(box1ab)ab
的东西实例化
vab
——除了两个
a
变量来自不同的地方;实际上,它们被消歧为
(box1ab)a1b1
。这与
框1 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
所需要的。而
box1ab
只是一个类型,没有参数。不匹配!奥托

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

这个特殊的问题是由于压痕不当造成的。虽然还有一件事我做错了。因此,编译了以下版本:

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

在这种情况下,错误可能是由缩进引起的,
foo
声明与
Boxer
类不关联,因此它要求所有v a b都使用
类型的函数。v a b->Double
。除此之外,
instance Boxer(Box1 a b)
不正确-它应该是
instance Boxer Box1
。如果
foo
函数与
Boxer
类正确关联,则前者将是一个类型错误。@user2407038非常感谢。这确实是由于缩进造成的错误。但请您解释一下,当我创建一个Foldable实例时,编译器不允许我执行实例Foldable Box1。它要求在Box1上添加更多参数。您必须编写
实例可折叠(Box1 a)
-可折叠的
类采用类型为
*->*
的参数,而
Box1
的类型为
*->*->*
。在这种情况下,错误可能是由于缩进造成的-
foo
声明与
Boxer
类无关,因此,对于所有的vab,它需要一个
类型的函数。v a b->Double
。除此之外,
instance Boxer(Box1 a b)
不正确-它应该是
instance Boxer Box1
。如果
foo
函数与
Boxer
类正确关联,则前者将是一个类型错误。@user2407038非常感谢。这确实是由于缩进造成的错误。但请您解释一下,当我创建一个Foldable实例时,编译器不允许我执行实例Foldable Box1。它要求在Box1上放置更多参数。您必须编写
实例可折叠(Box1 a)
可折叠
类采用
*->*
类型的参数,而
Box1
类型为
*->*
。这解决了代码中的语义错误,但是OP中的类型错误是由于原始代码中不正确的缩进造成的。这解决了代码中的语义错误,但是OP中的类型错误是由于原始代码中不正确的缩进造成的。