2014-07-09 17 views
16

Diciamo che ho due types:È possibile confrontare due tipi, se uno è assegnabile dall'altro?

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

è possibile determinare in Template Haskell che un'espressione di t1 può anche essere di t2? (Senza attuazione tipo unificazione me stesso.)

+0

Se è possibile, dovresti utilizzare il nuovo modello di haskell del modello digitato, ma non ne so nulla. Probabilmente potresti fare una sorta di asserzione in fase di compilazione generando un codice morto come: 'a = (undefined :: (Functor f) => (a -> b) -> f a -> f b); b :: (Int -> Char) -> [Int] -> [Char]; b = a' – jberryman

risposta

-4

Sì, è possibile typecast tutti gli altri variabile per la classe più astratta utilizzato

1

Come jberryman dice nei commenti, è possibile generare il codice che costringerà coontrollore dei tipo di unificare i due tipi. Tuttavia, non è possibile collegarsi al tipografo per verificarlo effettivamente e derivare il risultato. Semplicemente non hai il giusto accesso all'ambiente full typeckecker nella fase di espansione TH.