2013-01-14 7 views
7

なぜテンプレートHaskellはスタンドアロン派生宣言の引用を無視するのですか?テンプレートのスタンドアロン派生宣言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 

答えて

7

これは宣言のテンプレートHaskellのデータ型がスタンドアロン導出インスタンスを格納さえできないコンパイラ、(http://hackage.haskell.org/packages/archive/template-haskell/2.8.0.0/doc/html/Language-Haskell-TH-Syntax.html#t:Dec参照)の欠点であるために使用。

7.10だからといって、this bugが修正されました。 (@ Vladimirのおかげで、これは以下のコメントにこれを指摘してくれました)

+0

本当に、私はスタンドアロンがライブラリのcostructorを派生していないことに気付きました。引用によってそれを得ることを望んでいた。 – leventov

+0

スタンドアロンの派生はテンプレートHaskellよりも前のコンパイル段階で起こるため、これが原因だと思われます。 typecheckerの代わりにrenamerで、または何か。 –

+0

GHC 7.10以降で動作するはずです(https://ghc.haskell.org/trac/ghc/ticket/8100を参照)。 –

関連する問題