使用GADT实现类型类

时间:2014-05-28 18:17:39

标签: haskell gadt

我在Haskell中编写了以下线性代数向量

data Natural where
    Zero :: Natural
    Succ :: Natural -> Natural

data Vector n e where
    Nil :: Vector Zero e
    (:|) :: (Show e, Num e) => e -> Vector n e -> Vector (Succ n) e
infixr :|

instance Foldable -- ... Vector ..., but how do I implement this?

当我尝试实施Foldable时,我遇到ZeroSucc有不同定义的问题(即。*和* - > *)。

这个问题有明显的解决方案吗?

2 个答案:

答案 0 :(得分:5)

它只是

instance Foldable (Vector n) where
  fold Nil       = mempty
  fold (a :| as) = a <> fold as

我不建议在e类型中添加约束。

答案 1 :(得分:3)

您不需要在类实例中提及ZeroSucc,这是GADT的全部要点:构造函数上的模式匹配会为您提供类型信息:

instance F.Foldable (Vector v) where
  foldr _ zero Nil = zero
  foldr f zero (e0 :| v) = f e0 $ F.foldr f zero v