Haskellのderiving
例えば
code:hs
data Person = Person
{ name:: String
, age::Int
} deriving (Eq)
Eqは==や/=が使える
つまりPerson型の値aと値bを==で比較できるようになった
どう比較するか?
まず最初に値コンストラクタPersonが一致しているかを比較
その後、各フィールドname,ageの中身を==を使って比較する
ここで、各フィールドの型がEq型クラスのインスタンスでないといけない
ここでは、StringもIntもEq型クラスのインスタンスなので、PersonはEq型クラスのインスタンスになることができる
code:hs
{-# OPTIONS_GHC
-ddump-deriv
-dsuppress-idinfo
-dsuppress-coercions
-dsuppress-type-applications
-dsuppress-uniques
-dsuppress-module-prefixes
GHC内のderiving機能を実装している箇所
関連するGHC拡張
ベスプラ
暗黙のderiving strategyを警告するoptionがある
Show, Eqは常にderivingしよう
Showは自分で定義しないようにしよう
derivingを使ってisntanceにすべき
自前で表示を変えたい場合は個別の型クラスを作ればいい
ボイラープレートをなくすためのderivingではあるが、derivingを書きまくるというボイラープレートが発生することになったので、それを回避するための拡張の提案
却下されたっぽい
コンパイルに掛かる時間はどれぐらい変わるのか
でかいdata型の場合、30minぐらいかかってしまう(?)
いくつかの型クラスに対して比較した記事
割と差がある
derivingできるものとできないものの差はなにか
derivingしたが意図に合わなかったというケースは稀にでもあるものなのか
参考
deriving周辺の解説