尝试使用存在量化时获得类型不匹配错误

时间:2009-12-12 00:25:13

标签: haskell types

想宣布

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包中的修改版本

1 个答案:

答案 0 :(得分:4)

这可能对您有用:

data (Coord p, Num a) => Triangle p a = Triangle {t0 :: p a, t1 :: p a, t2 :: p a}

简而言之,具有类型类Coord的类型是参数化类型。你必须提供参数。

(类型的告诉你它是否有任何参数。种类*可以有实际值。所有其他类型都是参数化的。任何具有类型类{的类型{ {1}}属于Coord种类,这意味着它需要一种类型为* -> *的参数。)