7

テンプレート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
4

1 に答える 1

7

これは以前はコンパイラの欠点であり、宣言用の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に感謝します。)

于 2013-01-14T11:49:58.833 に答える