2

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

この問題の明白な解決策はありますか?

4

2 に答える 2

3

Zeroクラス インスタンスでorを言及する必要はありません。これがSuccGADT の要点です。コンストラクターでのパターン マッチングにより、型情報が得られます。

instance F.Foldable (Vector v) where
  foldr _ zero Nil = zero
  foldr f zero (e0 :| v) = f e0 $ F.foldr f zero v 
于 2014-05-28T18:28:02.377 に答える