Typ-Inferenz im allgemeinen für abhängige Arten unentscheidbar ist, siehe z.B. the answers to this CS.SE question. In Idris können Sie nicht nur Typen für einige Begriffe angeben, sondern alle.
Wenn Sie Ihre Definition zu einer .idr
Datei hinzufügen und versuchen, es zu laden, wie
myId = \x => x
Sie die informative Fehlermeldung
No type declaration for Main.myId
Also mal sehen bekommen, wie weit müssen wir gehen Geben Sie einen Typ (der folgende ist mit Idris 0.10.2):
myId : _
myId = \x => x
When checking right hand side of myId
with expected type iType
Type mismatch between _ -> _
(Type of \x => x
) and iType
(Expected type)
OK, lassen Sie uns einen Funktionstyp versuchen:
myId : _ -> _
myId = \x => x
When checking right hand side of myId
with expected type ty -> hole
Type mismatch between ty
(Type of x
) and hole
(Expected type)
Ich werde Sie nachfolgende Schritte ersparen, aber im Grunde myId : {a : Type} -> a -> _
und myId : {a : Type} -> _ -> a
beide nicht die gleiche Art und Weise, so dass uns mit
myId : {a : _} -> a -> a
myId = \x => x
Also mussten wir den vollen Typ von myId
mit Ausnahme der Universumsebene der Typvariablen a
angeben.
Die endgültige Version von myId
‚Art Signatur s auch als
myId : a -> a
myId = \x => x
geschrieben werden kann: Ist das nicht einfach, weil Idris nicht Typinferenz für Funktionen haben? – Cactus