Ich möchte dafür folgendes kompilieren:
%Vor% Dies kann nicht kompiliert werden, da der Compiler n
nicht mit n + m
vereinheitlichen kann. Ich verstehe, dass dies wegen der Signatur von take
für Vect ist, aber ich kann nicht herausfinden, wie man den Compiler zeigt, dass sie vereinheitlicht werden können, wenn m = 0
.
Um nur zur vorherigen Antwort hinzuzufügen, besteht eine andere Möglichkeit darin, das Inline-Schreiben mit dem vorhandenen plusZeroRightNeutral
Lemma aus der Bibliothek neu zu schreiben:
Die Schwierigkeit, die Idris bei der Vereinheitlichung hat, ist, dass er nicht bereit ist, die m
in der Anwendung von take abzuleiten:
Sie haben es einem Vect n String
gegeben, wo es ein Vect (n + m) a
wollte - es hat erfreulicherweise das a
mit dem String
vereinheitlicht, weil Vect
ein Typkonstruktor ist, aber nicht bereit ist,% co_de zu vereinheitlichen % mit n
, weil es im Allgemeinen Funktionen nicht invertieren kann. Du und ich können sagen, dass n + m
Null sein muss, aber Idris ist nicht so schlau.
Idris kann n
nicht mit n + m
vereinheitlichen, weil es n = n + 0
nicht kennt. Sie müssen ihm helfen, indem Sie das manuell beweisen.
Zuerst, warum es diesen Beweis benötigt. Der Grund dafür ist, dass take
Vect (n+m) a
erwartet:
Also wird dies check
%Vor% Sie benötigen eine Möglichkeit, Vect n a
in Vect (n + 0) a
zu konvertieren:
Dies ist mit replace
function möglich:
Aber jetzt brauchst du einen Beweis, dass n = n + 0
. Hier ist es (mit dem Rest des Codes):
Scheint zu viel für so eine einfache Funktion. Hoffe, jemand wird eine prägnantere Lösung zeigen.
Tags und Links dependent-type idris