Hier ist ein Vektor, dessen Elemente durch die Länge des Vektors indiziert sind.Warum akzeptiert Idris meine benutzerdefinierte Falte nicht?
data IxVect : (n : Nat) -> (a : Nat -> Type) -> Type where
Nil : IxVect 0 a
(::) : a n -> IxVect n a -> IxVect (S n) a
Ich möchte eine IxVect
zusammenzufalten.
total
foldr : {b : Nat -> Type} -> ({m : Nat} -> a m -> b m -> b (S m)) -> b Z -> IxVect n a -> b n
foldr f z Nil = z
foldr f z (x :: xs) = f x (foldr f z xs)
Ich erhalte den folgenden Fehler in dem Schritt Fall:
test.idr:9:25:
When elaborating right hand side of Main.foldr:
Can't convert
(Nat -> Type) -> Type
with
Type -> Type
Ich bin verwirrt über das, was der Fehler, mir zu sagen versucht. Meine Definition von foldr
sieht mir nicht falsch, und es funktioniert gut in Haskell:
data Nat = Z | S Nat
data IxVect n a where
Nil :: IxVect Z a
Cons :: a n -> IxVect n a -> IxVect (S n) a
foldr :: (forall m. a m -> b m -> b (S m)) -> b Z -> IxVect n a -> b n
foldr f z Nil = z
foldr f z (Cons x xs) = f x (foldr f z xs)
Warum wird nicht meine foldr
Typprüfung in Idris?
Der aktuelle Idris-Master auf github ist viel besser darin, Namen nach Typ zu disambiguieren (und in der Tat einen viel besseren Job, wenn Fehler gemeldet werden). Ihr Beispiel funktioniert gut, ohne Änderung. Es wird bald eine neue Veröffentlichung geben. –