使用元组时非法实例声明
在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
实例。 在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'
确保标量乘数与矢量分量实际上是相同的类型。 这是矢量空间库如何去做的。 对于您的代码,它将采用表单
{-# 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)