想宣布
data (Coord a) => Triangle a = Triangle{t0 :: a, t1 :: a, t2 :: a}
但是我得到了
Geometry.hs:15:19:有点不匹配 预期种类
* -> *', but
p'有种类*' In the class declaration for
Coord'
其中Coord定义为
class (Traversable p, Functor p, Foldable p, Applicative p) => Coord p where
getComponents :: Num a => p a -> [a]
getComponents = toList
fromComponents :: Num a => [a] -> p a
magSq :: Num a => p a -> a
magSq = Prelude.sum . map (\x -> x * x) . getComponents
dotProduct :: Num a => p a -> p a -> a
dotProduct a b = Prelude.sum $ zipWith (*) (getComponents a) (getComponents b)
有什么想法吗?
PS。代码是Data.SG包中的修改版本
答案 0 :(得分:4)
这可能对您有用:
data (Coord p, Num a) => Triangle p a = Triangle {t0 :: p a, t1 :: p a, t2 :: p a}
简而言之,具有类型类Coord
的类型是参数化类型。你必须提供参数。
(类型的种告诉你它是否有任何参数。种类*
可以有实际值。所有其他类型都是参数化的。任何具有类型类{的类型{ {1}}属于Coord
种类,这意味着它需要一种类型为* -> *
的参数。)