2014-07-09 7 views
16

Powiedzmy mam dwa types:Czy można porównać dwa typy, jeśli można je przypisać z drugiego?

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

Czy to możliwe do ustalenia w Template Haskell że wyrazem t1 może być również t2? (Bez wdrożenia typu unifikacji siebie.)

+0

Jeśli jest to możliwe, musisz użyć nowego szablonu szablonu, ale nic o tym nie wiem. Prawdopodobnie mógłbyś stworzyć coś w rodzaju kompilacji, generując martwy kod, taki jak: a = (undefined :: (Functor f) => (a -> b) -> f a -> f b); b :: (Int -> Char) -> [Int] -> [Char]; b = a' – jberryman

Odpowiedz

-4

Tak, można typecast wszystkie inne zmienne do najbardziej abstrakcyjnej klasy używanego

1

Jak jberryman mówi w komentarzach, można wygenerować kod, który wymusi na typechecker ujednolicenie dwa typy. Jednak nie możesz zablokować się w kontrolerze typologicznym, aby sprawdzić, czy sam i gałąź na wynik. Po prostu nie masz odpowiedniego dostępu do pełnego środowiska typechecker na etapie ekspansji TH.

Powiązane problemy