我在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
时,我遇到Zero
和Succ
有不同定义的问题(即。*和* - > *)。
这个问题有明显的解决方案吗?
答案 0 :(得分:5)
它只是
instance Foldable (Vector n) where
fold Nil = mempty
fold (a :| as) = a <> fold as
我不建议在e
类型中添加约束。
答案 1 :(得分:3)
您不需要在类实例中提及Zero
或Succ
,这是GADT的全部要点:构造函数上的模式匹配会为您提供类型信息:
instance F.Foldable (Vector v) where
foldr _ zero Nil = zero
foldr f zero (e0 :| v) = f e0 $ F.foldr f zero v