使用元组时非法实例声明

时间:2015-12-22 13:33:09

标签: haskell typeclass

在Haskell中乱搞,更加密切地了解类型类,但我遇到了一些障碍。无论出于何种原因,我都不允许制作我的class Vector v where vplus :: v -> v -> v vmult :: Num a => v -> a -> v instance Num a => Vector (a, a) where (a, b) `vplus` (c, d) = (a + c, b + d) (a, b) `vmult` m = (a * m, b * m) 课程的实例。我被告知这是非法的实例声明,因为我没有不同的类型变量?这里发生了什么?

RECORDDATE

1 个答案:

答案 0 :(得分:6)

a实例中的

(a,a)将是一个任意Num个实例。 a中的vmult :: Num a => v -> a -> v对此一无所知,即这可能是任何其他 Num实例。

要使课程成功,您需要

  • 确保数字类型可以相互转换。例如,

    class Vector v where
      vplus :: v -> v -> v
      vmult :: RealFrac a => v -> a -> v
    
    instance RealFrac a => Vector (a, a) where
      (a, b) `vplus` (c, d) = (a + c, b + d)
      (a, b) `vmult` m' = (a * m, b * m)
        where m = realToFrac m'
    
  • 确保标量乘数实际上与向量分量的类型相同。这是vector-space库的工作方式。对于您的代码,它将采用表单

    {-# LANGUAGE TypeFamilies, FlexibleInstances #-}
    
    class Vector v where
      type Scalar v :: *
      vplus :: v -> v -> v
      vmult :: v -> Scalar v -> v
    
    instance Num a => Vector (a, a) where
      type Scalar (a,a) = a
      (a, b) `vplus` (c, d) = (a + c, b + d)
      (a, b) `vmult` m = (a * m, b * m)