Haskell 哈斯克尔:GHCI中错误的含义

Haskell 哈斯克尔:GHCI中错误的含义,haskell,Haskell,我不知道这个错误意味着什么。我想为下面的数据类型定义函数距离。。。我不想使用任何GHC扩展。。即使代码很难看,在我继续使用扩展之前,我也希望更好地理解错误。有人能告诉我这个错误是什么意思,我怎样才能摆脱它 class Vector v where distance :: v -> v -> Double -- doesn't make sense, but WTH... newtype OneD1 a = OD1 a deriving

我不知道这个错误意味着什么。我想为下面的数据类型定义函数距离。。。我不想使用任何GHC扩展。。即使代码很难看,在我继续使用扩展之前,我也希望更好地理解错误。有人能告诉我这个错误是什么意思,我怎样才能摆脱它

class Vector v where

         distance :: v -> v -> Double

-- doesn't make sense, but WTH...    
newtype OneD1 a = OD1 a
         deriving (Show)

instance Vector (Maybe m) where
    distance _ _ = 5.6

instance Vector (OneD1 m) where
   distance (OD1 x1) (OD1 x2) = x2-x1

    Prelude> :reload
[1 of 1] Compiling Main             ( VectorTypeClass.hs, interpreted )

VectorTypeClass.hs:33:33:
    Couldn't match expected type `Double' with actual type `m'
      `m' is a rigid type variable bound by
          the instance declaration
          at C:\Users\byamm\Documents\Programming\Haskell\Lab\Expts\VectorTypeClass\VectorTypeClass.hs:32:10
    Relevant bindings include
      x2 :: m
        (bound at C:\Users\byamm\Documents\Programming\Haskell\Lab\Expts\VectorTypeClass\VectorTypeClass.hs:33:27)
      x1 :: m
        (bound at C:\Users\byamm\Documents\Programming\Haskell\Lab\Expts\VectorTypeClass\VectorTypeClass.hs:33:18)
      distance :: OneD1 m -> OneD1 m -> Double
        (bound at C:\Users\byamm\Documents\Programming\Haskell\Lab\Expts\VectorTypeClass\VectorTypeClass.hs:33:4)
    In the first argument of `(-)', namely `x2'
    In the expression: x2 - x1
Failed, modules loaded: none.
Prelude>
这保证了
(OdeD1 m)
对于任何
m
,都是一个向量。包括
OneD1字符串

   distance (OD1 x1) (OD1 x2) = x2-x1
在这里,我们尝试将
-
应用于
m
类型的两个值,这两个值可以是任何值。这里有两个问题:

  • m
    可能不是数字类型——GHC目前没有报告此错误
  • 差异的结果也是类型
    m
    ,但距离应产生
    。这是GHC报告的错误
您需要将
m
限制为某个数字类型,以便可以使用
-
,并且该类型必须允许转换为
,否则无法满足
距离
签名

一个简单的方法是:

instance Vector (OneD1 Double) where
   distance (OD1 x1) (OD1 x2) = x2-x1
另一个可能是:

instance Real m => Vector (OneD1 m) where
   distance (OD1 x1) (OD1 x2) = realToFrac (x2-x1)
这保证了
(OdeD1 m)
对于任何
m
,都是一个向量。包括
OneD1字符串

   distance (OD1 x1) (OD1 x2) = x2-x1
在这里,我们尝试将
-
应用于
m
类型的两个值,这两个值可以是任何值。这里有两个问题:

  • m
    可能不是数字类型——GHC目前没有报告此错误
  • 差异的结果也是类型
    m
    ,但距离应产生
    。这是GHC报告的错误
您需要将
m
限制为某个数字类型,以便可以使用
-
,并且该类型必须允许转换为
,否则无法满足
距离
签名

一个简单的方法是:

instance Vector (OneD1 Double) where
   distance (OD1 x1) (OD1 x2) = x2-x1
另一个可能是:

instance Real m => Vector (OneD1 m) where
   distance (OD1 x1) (OD1 x2) = realToFrac (x2-x1)

在距离
的类型签名中,您说的是
v->v->Double
。在
OneD1 m
的实例声明中,您有
x1
x2
类型的
m
。这就是您在
OneD1 m
中提到的m。由于类型为
v->v->Double
Haskell希望构造类型为
Double
的值。这意味着
m
=
Double
。但是
m
不是
Double
。您可以使用类型族或进一步推广
距离的类型来解决此问题。例如
distance::v->v->v
实例Num m=>Vector(OneD1 m),其中
。在
distance
的类型签名中,您说的是
v->Double
。在
OneD1 m
的实例声明中,您有
x1
x2
类型的
m
。这就是您在
OneD1 m
中提到的m。由于类型为
v->v->Double
Haskell希望构造类型为
Double
的值。这意味着
m
=
Double
。但是
m
不是
Double
。您可以使用类型族或进一步推广
距离的类型来解决此问题。例如
距离::v->v->v
实例Num m=>向量(OneD1 m),其中