deriving strategy
つまりある型クラスをいくつかの方法で導出しうる
コンパイラはその中から適切なものを選択しないといけない
型クラスとデータ型の組み合わせによって使用できる戦略が複数ある場合もある
明示していない場合は、GHCの基準によって、どれかが選択される
標準のderiving strategy
普通に deriving (Show)
みたいに書くやつ
コンパイラが用意したderivingアルゴリズムを使用してderivingする
対象の型クラス
Eq
Ord
Show
Read
Enum
Bounded
元の型のinstance実装を流用する
任意の型クラスをderivingできる
instanceを空の実装としてderivingする
型クラスにdefaultの定義がある場合は、それを利用する
同型な2つの型があったときに、型クラスのinstanceの実装を共有する
指定されたcastできる範囲のデータ型のinstanceを流用する
Kowainikによるその他のderiving戦略の分類
これと上の基本的な4つとの違い、スタンスの違いがよくわからん

Auto derived
対象の型クラス
常にGHCがinstanceを定義してくれる
やろうと思えば手動でも定義できるらしい
Derive Whatever
Standalone deriving
Empty Deriving
型の数が0の型に対してもderivingできるようになる
GHCは
deriving句を見つけると、deriving句内に書かれてある全ての型クラスのstrategyを関連付ける
このプロセスのことをこう呼ぶ
参考
一つ一つの戦略についても1節割いて説明がある
DerivingViaに関する記事だが、前半にderiving strategyの概要がある
DerivingViaを使えば、他の戦略も模倣できるよ、ということが書かれてある