Ich programmiere eine abhängige Bibliothek in Haskell. Mit Profilierung auf meinem Test ausführbar sehe ich so etwas wie:Laufzeitkosten von abhängiger Programmierung mit GHC
commutativity' Math 1189 4022787186 29.1 27.2 29.1 27.2
commutativity'
ist im Grunde (rekursiv) der Nachweis der Integer-Addition commutativity Eigenschaft für Typ-Level-Zahlen. Es ist dies definiert:
commutativity' :: SNat n -> SNat m -> Plus (S n) m :~: Plus n (S m)
commutativity' SZ m = Refl
commutativity' (SS n) m = gcastWith (commutativity' n m) Refl
Und dann in meiner Bibliothek verwendet mit gcastWith
die Gleichwertigkeit der verschiedenen Arten zu beweisen.
Also ... 29% meiner Laufzeit ist für etwas völlig nutzlos ausgegeben, da Typ-Überprüfung zur Kompilierzeit passiert.
Ich hatte naiv angenommen, dass dies nicht passieren würde.
Gibt es etwas, was ich tun kann, um diese nutzlosen Anrufe zu optimieren?
Dies sind die Kosten für die Verwendung einer gesamten Sprache. Typ Sicherheit beruht auf der Bewertung von Beweisen in kanonischer Form. In vollständigen Sprachen können Proofs ohne Auswertung vertraut und somit zur Laufzeit gelöscht werden. Sie könnten den Trust-Hit nehmen und 'unsafeCoerce' verwenden, nachdem Sie überprüft haben, dass Ihr Programm hinter dem Typchecker steht. – pigworker
Siehe Abschnitt 4.4.4 "Laufende Beweise" von Richard A. Eisenbergs These https://arxiv.org/abs/1610.07978 – danidiaz
Ich träume davon, dass GHC einen (abstrakten) Checker für die Terminierung integriert und automatisch "Beweise" mit Hilfe von Null optimiert/neu schreibt Kostbare Zwänge. Das wäre _really_ nett. – chi