generated at
Haskellのderiving



例えば
hs
data Person = Person { name:: String , age::Int } deriving (Eq)
Eqは == /= が使える
つまりPerson型の値aと値bを == で比較できるようになった
どう比較するか?
まず最初に値コンストラクタ Person が一致しているかを比較
その後、各フィールド name , age の中身を == を使って比較する
ここで、各フィールドの型がEq型クラスのインスタンスでないといけない
ここでは、StringもIntもEq型クラスのインスタンスなので、PersonはEq型クラスのインスタンスになることができる


derivingによって生成されたものを確認する ref
hs
{-# OPTIONS_GHC -ddump-deriv -dsuppress-idinfo -dsuppress-coercions -dsuppress-type-applications -dsuppress-uniques -dsuppress-module-prefixes #-}
こんなにいろいろOPTIONS_GHC指定しないといけないのかmrsekut


GHC内のderiving機能を実装している箇所


関連するGHC拡張


ベスプラ
deriving strategyを常に明示する
暗黙のderiving strategyを警告するoptionがある
Show, Eqは常にderivingしよう
Showは自分で定義しないようにしよう
derivingを使ってisntanceにすべき
自前で表示を変えたい場合は個別の型クラスを作ればいい
.cabalこの辺を常に書いとけばいい


ボイラープレートをなくすためのderivingではあるが、derivingを書きまくるというボイラープレートが発生することになったので、それを回避するための拡張の提案
却下されたっぽい


コンパイルに掛かる時間はどれぐらい変わるのか
この節の最後の方で言及されている
でかいdata型の場合、30minぐらいかかってしまう(?)
いくつかの型クラスに対して比較した記事
割と差がある
derivingできるものとできないものの差はなにか
derivingしたが意図に合わなかったというケースは稀にでもあるものなのか


参考
deriving周辺の解説