Ich versuche, mehr über Phantomtypen zu erfahren. Ich versuche Fun with Phantom Types von Ralf Hinze zu lesen. Er benutzt ein Schlüsselwort with
, das ich vorher nicht gesehen habe und das ich nicht kompilieren kann. Ich bekomme einen Parse-Fehler auf =
, wenn ich dies versuche.Phantomtypen definieren - Beispiele können nicht kompiliert werden
data Type t = RInt with t = Int
| RChar with t = Char
| RList (Type a) with t = [a ]
| RPair (Type a) (Type b) with t = (a, b)
Früher in dem Papier, sagt er, dass die „mit“ Aussagen nicht unbedingt erforderlich sind, dass Sie a = t
stattdessen setzen können, aber ich kann nicht herausfinden, wie dieser Datentyp ohne sie zu definieren. Die folgenden Fehler mit: Not in scope: type variable 'a'
data Type t = RInt
| RChar
| RList (Type a)
| RPair (Type a) (Type b)
Was fehlt mir?
Es sieht so aus, als ob es sehr möglich ist, das obige mit GADTs zu schreiben, aber ich bin immer noch daran interessiert, was Ralf beabsichtigt hat. Gibt es ein spezielles Keyword? Können Sie das ohne GADTs ausdrücken? –
> "Wenn wir nur die Mittel hätten, das Typargument von Term auf einen bestimmten Typ zu beschränken. Nun ist es genau das, was die oben erwähnte 'milde' Erweiterung zu macht. Angesichts dieser Erweiterung deklarieren wir den Term-Datentyp als folgt ... "Vielleicht habe ich versäumt, aber ich denke, das ist eine * imaginäre * Erweiterung, die es nicht wirklich gibt (oder so ** ich ** denke), aber ja, GADTs werden es tun;) – Carsten