PureScriptのderiving
derive instance ..という構文
code:purs(hs)
data MyADT
= Some
| Arbitrary Int
| Contents Number String
derive instance Eq MyADT
derive instance Ord MyADT
hsのdata .. = .. deriving (..)と同じ
自動導出できる型が決まっている
Generic, Eq, Ord, Functor, NewType
これ以外のものに対してderivingしたい場合はGenericを使う
例えば、自作した型を楽にShowのinstanceにする例
wrapしている型がinstanceになっている型クラスに対してderivingできる
dataの場合5種のみだったことに対照的
例えば、Score Intをnewtypeで作ったとき
Intがinstanceとして定義されている型クラスはderivingできる
IntはSemiringのinstanceなので以下のように書ける
code:purs(hs)
newtype Score = Score Int
derive newtype instance Semiring Score
型引数に制約がある場合
code:purs(hs)
derive newtype instance Eq (f a) => Eq (Alternate f a)
勿論Genericもderivingできる
そうなると、Genric経由するかどうかの差異が気になってくる ref code:purs(hs)
newtype Score = Score Int
-- derive newtypeで直接Showのderiving
-- e.g. logShow (Score 5) → 5
derive newtype instance Show Score
-- Generic経由でShowのderiving
-- e.g. logShow (Score 5) → Score 5
derive instance Generic Score _
instance Show Score where
show = genericShow
前者は、Intに対するshowと考えられるので、型コンストラクタはつかずに、内部の5がshowされる