Frage

Angenommen, ich habe eine Funktion (sie macht wirklich das, was der Name sagt):

filter : ∀ {A n} → (A → Bool) → Vec A n → ∃ (λ m → Vec A m)

Jetzt möchte ich irgendwie mit dem abhängigen Paar arbeiten, das ich zurückgebe.Ich habe einfach geschrieben head Funktion:

head :: ∀ {A} → ∃ (λ n → Vec A n) → Maybe A
head (zero   , _ )       = nothing
head (succ _ , (x :: _)) = just x

was natürlich perfekt funktioniert.Aber ich habe mich gefragt:Kann ich irgendwie sicherstellen, dass die Funktion nur mit aufgerufen werden darf? n ≥ 1?

Im Idealfall würde ich gerne eine Funktion herstellen head : ∀ {A} → ∃ (λ n → Vec A n) → IsTrue (n ≥ succ zero) → A;aber das scheitert, denn n liegt außerhalb des Gültigkeitsbereichs, wenn ich es verwende IsTrue.

Vielen Dank für Ihre Zeit!


IsTrue ist so etwas wie:

data IsTrue : Bool → Set where
  check : IsTrue true
War es hilfreich?

Lösung

Ich denke, das ist eine Frage zum Unerkenntnis. Die Standardbibliothek sorgt für Unabrechnungen Funktionen für Produkte, siehe Unkonvertieren . Für Ihre Situation wäre es vorteilhafter, eine Unkomplizierungsfunktion bei der ersten zu haben Argument ist ausgeblendet, da eine Kopffunktion normalerweise den Längenindex als implizite Argument ergreift. Wir können solche Unkonkurrenzfunktion schreiben: generasacodicetagpre.

die Funktion, die den Kopf eines Vektors zurückgibt, wenn in der Standardbibliothek nicht vorhanden ist, Also schreiben wir einen: generasacodicetagpre.

Jetzt ist Ihre gewünschte Funktion nur eine Frage der sich nicht vielleicht-head-Funktion mit dem ersten argumentation implizit-nicht oben definiert definiert: generasacodicetagpre.

Schlussfolgerung: abhängige Produkte familiär curry und nicht wie ihre nichtabhängigen Versionen.

beiseite nicht beiseite, die Funktion, mit der Sie schreiben möchten, mit der Typ Signature generasacodicetagpre.

kann geschrieben werden als: generasacodicetagpre.

Andere Tipps

Der beste Weg ist wahrscheinlich, das abhängige Paar zuerst zu zerstören, sodass Sie einfach schreiben können: generasacodicetagpre.

Wenn Sie jedoch wirklich das abhängige Paar intakt in der Funktionszeichen halten möchten, können Sie ein Prädate-POSN schreiben, das das erste Element des Paares inspiziert und prüft, dass es positiv ist: generasacodicetagpre.

oder ähnlich.Ich werde die Definition von POSN als Übung zum Leser hinterlassen.Im Wesentlichen ist dies die Antwort von Vitus bereits, sondern ein einfacheres Prädikat kann stattdessen definiert werden.

Nachdem ich seit einiger Zeit damit gespielt habe, kam ich mit der Lösung, die der Funktion auf den ersten Platz ähnelt: generasacodicetagpre.

Wenn jemand mit besserer (oder mehr allgemeinerer) Lösung auftritt, akzeptiere ich gerne ihre Antwort.Kommentare sind auch willkommen.


Hier ist ein allgemeineres Prädikat, das ich aufkam: generasacodicetagpre.

Das ist genau wie das Übliche head Funktion für Vec.

head' : ∀ {α} {A : Set α} → ∃ (λ n → Vec A (suc n)) → A
head' (_ , x ∷ _) = x
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top