Haskellのderiving
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型クラスのインスタンスになることができる
derivingによって生成されたものを確認する ref
code:hs
{-# OPTIONS_GHC
-ddump-deriv
-dsuppress-idinfo
-dsuppress-coercions
-dsuppress-type-applications
-dsuppress-uniques
-dsuppress-module-prefixes
#-}
こんなにいろいろOPTIONS_GHC指定しないといけないのかmrsekut.icon
GHC内のderiving機能を実装している箇所
https://gitlab.haskell.org/ghc/ghc/-/blob/master/compiler/GHC/Tc/Deriv.hs
関連するGHC拡張
GHC拡張一覧#61000da91982700000f83f8f
ベスプラ
https://kowainik.github.io/posts/deriving#best-practices-with-deriving
deriving strategyを常に明示する
暗黙のderiving strategyを警告するoptionがある
Show, Eqは常にderivingしよう
Showは自分で定義しないようにしよう
derivingを使ってisntanceにすべき
自前で表示を変えたい場合は個別の型クラスを作ればいい
.cabalにこの辺を常に書いとけばいい
DerivingAlias
ボイラープレートをなくすためのderivingではあるが、derivingを書きまくるというボイラープレートが発生することになったので、それを回避するための拡張の提案
却下されたっぽい
https://kowainik.github.io/posts/deriving#meta-boilerplate-and-possible-future-improvements
#??
コンパイルに掛かる時間はどれぐらい変わるのか
この節の最後の方で言及されている
でかいdata型の場合、30minぐらいかかってしまう(?)
https://taylor.fausak.me/2017/08/09/deriving-type-classes-in-haskell-is-slow/
いくつかの型クラスに対して比較した記事
割と差がある
derivingできるものとできないものの差はなにか
derivingしたが意図に合わなかったというケースは稀にでもあるものなのか
参考
Strategic Deriving :: Kowainik
deriving周辺の解説