使用元组时非法实例声明

在Haskell中仔细研究类型类更加亲密,但我遇到了一些障碍。 无论出于何种原因,我不允许创建我的Vector类的实例。 我被告知这是一个非法的实例声明,因为我没有独特的类型变量? 这里发生了什么?

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)

a在你(a,a)例如将一个任意Num实例。 在avmult :: 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'
    
  • 确保标量乘数与矢量分量实际上是相同的类型。 这是矢量空间库如何去做的。 对于您的代码,它将采用表单

    {-# 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)
    
  • 链接地址: http://www.djcxy.com/p/43521.html

    上一篇: Illegal instance declaraion when using tuples

    下一篇: not clear which instance is chosen by Haskell