2015-07-25 71 views
6

Oto wektor, którego elementy są indeksowane przez długość wektora.Dlaczego Idris nie zaakceptuje mojego spasowania?

data IxVect : (n : Nat) -> (a : Nat -> Type) -> Type where 
    Nil : IxVect 0 a 
    (::) : a n -> IxVect n a -> IxVect (S n) a 

Chcę złożyć IxVect.

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) 

pojawia się następujący błąd w przypadku kroku:

test.idr:9:25: 
When elaborating right hand side of Main.foldr: 
Can't convert 
     (Nat -> Type) -> Type 
with 
     Type -> Type 

jestem mylić co błąd próbuje mi powiedzieć. Moja definicja foldr nie wygląda źle na mnie, i to działa dobrze w 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) 

Dlaczego nie mój typ kontroli w foldr Idris?

+2

Obecny master Idris na githubie znacznie lepiej identyfikuje nazwy według typu (a nawet znacznie lepiej sprawdza błędy raportowania, gdy się nie powiedzie). Twój przykład działa dobrze, bez modyfikacji. Niedługo pojawi się nowe wydanie. –

Odpowiedz

8

Idris miesza twoje foldr z już istniejącym. Możesz rozwiązać ten problem, kwalifikując wystąpienie rekursywne foldr lub zmieniając nazwę swojego foldr.

foldr : 
    {n : Nat} -> {a, 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 (Main.foldr f z xs) 
+0

Bingo! Dziękuję bardzo. Ten komunikat o błędzie nie wyjaśnia wcale :( –