型を定義する際に、 deriving 宣言を用いると、 Show クラスなどの型クラスに対して、
デフォルトの実装を使って自動的にインスタンス宣言を導出してくれて大変便利なのだが、
-- GHCi, version 7.8.3: http://www.haskell.org/ghc/ :? for help
ghci> data Hoge = Hoge Int deriving Show
ghci> :i Hoge
data Hoge = Hoge Int -- Defined at <interactive>:128:1
instance Show Hoge -- Defined at <interactive>:128:31
ghci> Hoge 3
Hoge 3
通常の deriving 宣言は、型定義時にしか使えないので、例えば、外部ライブラリで定義している型など、
手を加える事のできない型に対して、後から Show クラスを追加したい、などという時には、
いちいち自前でインスタンスの実装を記述しなければならず、大変めんどくさい。
そのような時、 GHC 拡張の StandaloneDeriving を使えば、型定義の後から ( もしくは定義ファイルの外部から ) 、 deriving 宣言をしてやることができて便利。
{-# LANGUAGE StandaloneDeriving #-}
module Main where
data Variables = C Char | S String | I Int | Iex Integer | D Double | F Float
data VarList a = Var a [Variables]
deriving instance Show Variables
deriving instance Show a => Show (VarList a)
ghci> S "hello"
S "hello"
ghci> Iex 5
Iex 5
ghci> Var "test" [S "aaa", D 5.2, C 'a']
Var "test" [S "aaa",D 5.2,C 'a']