在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
答案 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)