2016-04-11 8 views
4

Ich versuchte, eine String und String zu vergleichen, erwartet True.Wie vergleicht man Gleichheitstypen?

Idris> String == String 
Can't find implementation for Eq Type 

Dann erwartete ich False wenn eine String zu einem Bool zu vergleichen.

Idris> String /= Bool 
Can't find implementation for Eq Type 

Fehle ich eine import?

Antwort

6

Sie können nicht, wie es parametricity brechen würde, die wir in Idris haben. Wir können keine Muster für Typen zuordnen. Aber das wäre notwendig, um die Eq Implementierung, zum Beispiel zu schreiben:

{- Doesn't work! 
eqNat : Type -> Bool 
eqNat Nat = True 
eqNat _ = False -} 

Auch wenn man auf Arten Muster übereinstimmen könnte, würde sie in der Laufzeit benötigt werden. Momentan werden Typen beim Kompilieren gelöscht.

+0

Ist parametrisch erwünscht, damit der Compiler/die Schnittstelle die freien Terme ableiten kann? –

+1

Wenn in 'A == B' 'A' und' B' in kanonischer Form sind und zu einem geschlossenen Universum gehören, müssen Sie die Parameter nicht unterbrechen, um sie auf Gleichheit prüfen zu können (und Sie können die Ganzer "Typ" unter Verwendung von Induktions-Rekursion und irgendeiner Form von generischer Programmierung, wie sie es in der Beobachtungstheorie getan haben. [Hier] (https://github.com/effectfully/random-stuff/blob/master/EqType.agda) ist ein Code. Das Verwenden von Begriffen in kanonischer Form ist jedoch meist nutzlos, besonders wenn Sie ein nichtparametrisches Universum haben, das explizite Codes für Typen anbietet. – user3237465