Ich arbeite mit Data.Typeable und insbesondere möchte ich in der Lage sein, korrekte Typen einer bestimmten Art zu erzeugen (zB *
). Das Problem, das ich in laufen ließe, ist, dass TypeRep uns die folgende (Arbeiten mit der Version in GHC 7.8) erlaubt, zu tun:Ist es möglich, den Typ eines Typ-Konstruktors in Haskell zu bekommen?
let maybeType = typeRep (Proxy :: Proxy Maybe)
let maybeCon = fst (splitTyConApp maybeType)
let badType = mkTyConApp maybeCon [maybeType]
Hier badType
ist in einem gewissen Sinne die Darstellung des Typs Vielleicht Vielleicht das ist kein gültiger Typ jeglicher Art:
> :k Maybe (Maybe)
<interactive>:1:8:
Expecting one more argument to ‘Maybe’
The first argument of ‘Maybe’ should have kind ‘*’,
but ‘Maybe’ has kind ‘* -> *’
In a type in a GHCi command: Maybe (Maybe)
ich sehe nicht diese bei Typ-Ebene für die Durchsetzung, aber ich möchte in der Lage sein, ein Programm zu schreiben, das intelligent genug, um eine solche Typen zur Laufzeit zu vermeiden, zu konstruieren. Ich kann dies mit Datenebenenbegriffen mit TypeRep
tun. Im Idealfall würde ich so etwas wie
data KindRep = Star | KFun KindRep KindRep
hat und eine Funktion kindOf
mit kindOf Int = Star
hat (wahrscheinlich wirklich kindOf (Proxy :: Proxy Int) = Star
) und kindOf Maybe = KFun Star Star
, so dass ich „Art-check“ meinen TypeRep Wertes.
Ich denke, ich kann das manuell mit einer polykinded typeclass wie Typeable
tun, aber ich würde lieber nicht meine eigenen Instanzen für alles schreiben müssen. Ich würde es auch vorziehen, nicht zu GHC 7.6 zurückzukehren und die Tatsache zu verwenden, dass es für typeable Typen verschiedener Arten separate Typklassen gibt. Ich bin offen für Methoden, die diese Informationen von GHC erhalten.
'typeOf1' und' Typeable1' (und Freunde) werden immer noch aus 'Data.Typeable' exportiert ... sie sind in 7.8 verwendbar. –