Автономное объявление производного объекта в цитате Template Haskell

Почему Template Haskell игнорирует автономное объявление производного объекта в цитате?

{-# 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

person leventov    schedule 14.01.2013    source источник


Ответы (1)


Раньше это было недостатком компилятора, где тип данных Template Haskell для объявлений даже не способен хранить автономный производный экземпляр (см. http://hackage.haskell.org/packages/archive/template-haskell/2.8.0.0/doc/html/Language-Haskell-TH-Syntax.html#t:Dec).

Однако, начиная с 7.10, эта ошибка была исправлена. (Спасибо @VladimirStill за указание на это в комментарии ниже.)

person Joachim Breitner    schedule 14.01.2013
comment
Правда, заметил отсутствие в библиотеке автономного деривающего конструктора. Надеялся получить это через цитаты. - person leventov; 14.01.2013
comment
Я подозреваю, что это связано с тем, что автономное создание происходит на более ранней фазе компиляции, чем Template Haskell. В переименователе вместо проверки типов, что ли. - person Ben Millwood; 14.01.2013