【问题标题】:Getting kind mis-match error when trying to use existential quantification尝试使用存在量化时出现类型不匹配错误
【发布时间】:2011-04-19 02:58:46
【问题描述】:

想声明

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

但是我得到了

Geometry.hs:15:19:种类不匹配 预期种类 * -> *', butp' 有种类 *' In the class declaration forCoord'

其中坐标定义为

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 包中的内容稍作修改的版本

【问题讨论】:

    标签: haskell types


    【解决方案1】:

    这可能对你有用:

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

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

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

    【讨论】:

    • 谢谢。我会试一试,看看它是否有效,但是在阅读了更多内容之后,将量词放在构造函数中似乎是一种不好的形式,因为它需要对所有函数签名进行类似的量化,或者类似的东西那个。
    猜你喜欢
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多