2013-01-14 8 views
7

Perché Template Haskell ignora la dichiarazione di derivazione autonoma in offerta?Dichiarazione di derivazione autonoma in modello Haskell quotazione

{-# LANGUAGE TemplateHaskell, StandaloneDeriving #-} 
data Test a = Test a 
$([d| deriving instance Show a => Show (Test a); f x = x |]) 
ghci> :l Test.hs 
[1 of 1] Compiling Main    (Test.hs, interpreted) 
Ok, modules loaded: Main. 
ghci> :t f 
f :: t -> t 
ghci> Test 1 :: Test Int 

<interactive>:18:1: 
    No instance for (Show (Test Int)) arising from a use of `print' 
    Possible fix: add an instance declaration for (Show (Test Int)) 
    In a stmt of an interactive GHCi command: print it 

risposta

7

Questo deve essere utilizzato un difetto del compilatore, in cui il tipo di dati Template Haskell per dichiarazioni non è neppure in grado di memorizzare un un'istanza autonoma derivante (vedi http://hackage.haskell.org/packages/archive/template-haskell/2.8.0.0/doc/html/Language-Haskell-TH-Syntax.html#t:Dec).

Dal 7.10, tuttavia, this bug è stato risolto. (Grazie a @VladimirStill per averlo indicato in un commento qui sotto.)

+0

Vero, ho notato l'assenza di costruttore autonomo derivante nella libreria. Speravo di farcela attraverso le citazioni. – leventov

+0

Sospetto che ciò avvenga perché la derivazione autonoma avviene in una fase di compilazione precedente rispetto a Template Haskell. Nel renamer al posto del typechecker o qualcosa del genere. –

+0

Dovrebbe funzionare da GHC 7.10, vedere https://ghc.haskell.org/trac/ghc/ticket/8100. –