2014-07-09 8 views
16

Sagen wir, ich habe zwei types:Ist es möglich, zwei Arten zu vergleichen, wenn einer von den anderen zuweisbar ist?

t1 <- [t| (Functor f) => (a -> b) -> f a -> f b |] 
t2 <- [t| (Int -> Char) -> [Int] -> [Char] |] 

Ist es möglich, in Template Haskell, um festzustellen, dass ein Ausdruck von t1 auch von t2 sein kann? (Ohne Typ Vereinheitlichung der Umsetzung selbst.)

+0

Wenn es möglich ist, müssten Sie das neue typisierte Vorlage Haskell Zeug verwenden, aber ich weiß nichts darüber. Sie könnten wahrscheinlich eine Art Kompilierungszeit-Assertion machen, indem Sie einen toten Code wie folgt erzeugen: 'a = (undefined :: (Functor f) => (a -> b) -> f a -> f b); b :: (Int -> Char) -> [Int] -> [Char]; b = a' – jberryman

Antwort

-4

Ja, können Sie alle anderen Variablen auf die abstrakteste Klasse verwendet wird

1

typisieren Wie jberryman sagt in den Kommentaren, können Sie Code erzeugen, der die typechecker zwingen wird, zu vereinigen die zwei Arten. Sie können jedoch nicht in den Typchecker einklinken, um dies selbst zu überprüfen und auf das Ergebnis zu verzweigen. Sie haben einfach nicht den richtigen Zugriff auf die vollständige Typchecker-Umgebung in der TH-Ausbaustufe.

Verwandte Themen