Mein Ziel ist es, eine Funktion zu schreiben, die einige polymorphe Werte annimmt und mit Typreps auflistet, die konkrete Typen darstellen. Sie gibt eine neue Liste mit den gleichen Werten zurück, die jedoch bereits auf konkrete Typen angewendet wurden, die über typeReps angegeben wurden.Wie kann ich den Wert über 'TypeRep' festlegen?
Lassen Sie uns haben solche Liste von Werten: ["one", "two"]
mit -XOverloadedStrings
aktiviert.
Entsprechend ist jeder Typ IsString a => a
.
Liste der typereps wir in einer solchen Art und Weise bekommen konnte:
import Data.Typeable (Proxy(..), typeRep)
import Data.Text (Text)
[typeRep (Proxy :: Proxy String), typeRep (Proxy :: Proxy ByteString)]
Gibt es eine Möglichkeit String
und "two"
des Typs zu erhalten "one"
vom Typ ByteString
?
P.S. Um zu verhindern, Fehler nach Listenwert verschiedenen Typen enthalten, können wir jeden Wert in Dynamic.
, wie im Beispiel unten (Pseudo-Code) wickeln:
{-# LANGUAGE ParallelListComp #-}
import Data.Dynamic (toDyn)
[ toDyn (val :: type') | val <- vals | type' <- concreteTypes ]
es getan werden könnte Template Haskell verwenden, aber es wird auch sein hässlich.
Was wäre der Typ der resultierenden Liste? So etwas ist wahrscheinlich mit der neuen Reflektionsmaschinerie möglich, aber Sie müssten mindestens einen HList zurückgeben. – Alec
Eine Liste kann nur aus * einem * Elementtyp bestehen. –
@WillemVanOnsem Bearbeitet. – errfrom