Ich versuche, in Idris eine Funktion zu schreiben, die ein Vect durch die Größe des Vect und eine Funktion, die den Index zu übergeben in Parameter. Bisher habe ich dies:In Idris, wie schreibe ich eine "vect Generator" -Funktion, die eine Funktion des Index in Parameter
import Data.Fin
import Data.Vect
generate: (n:Nat) -> (Nat -> a) ->Vect n a
generate n f = generate' 0 n f where
generate': (idx:Nat) -> (n:Nat) -> (Nat -> a) -> Vect n a
generate' idx Z f = []
generate' idx (S k) f = (f idx) :: generate' (idx + 1) k f
Aber ich möchte sicherstellen, dass die Funktion in Parameter übergeben nur Index kleiner als die Größe des Vect nehmen wird. Ich habe versucht, dass:
generate: (n:Nat) -> (Fin n -> a) ->Vect n a
generate n f = generate' 0 n f where
generate': (idx:Fin n) -> (n:Nat) -> (Fin n -> a) -> Vect n a
generate' idx Z f = []
generate' idx (S k) f = (f idx) :: generate' (idx + 1) k f
Aber es ist nicht mit dem Fehler
Can't convert
Fin n
with
Fin (S k)
Meine Frage ist nicht kompiliert: ist, was ich will möglich tun und wie?
Ich habe (noch) keine Antwort, aber beachte zwei Dinge: 1. Wenn du eine "Count Up" -Funktion implementieren kannst, die 'n: Nat' nimmt und den Vektor' [FZ, ..., n-1] ', dann können Sie Ihre Funktion mit' map' aufbauen. 2. Es ist nicht allzu schwer, eine Funktion zum Umkehren von Vektoren zu schreiben. Wenn Sie also eine Möglichkeit finden, eine "Countdown" -Funktion zu schreiben, können Sie das Ergebnis rückwärts zählen. – dfeuer
Ein anderer Gedanke (vielleicht besser). Sie können ein "Fin n" zu einem "Fin (m + n)" immer "schwächen". Eine Idee könnte also sein, mit einem Argument nach oben und einem Argument nach unten zu arbeiten, und ein Argument, das ihre Summe beweist, ist richtig. – dfeuer