PureScriptのderiving
derive instance ..
という構文
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にする例
newtype
型に対するderiving
refwrapしている型がinstanceになっている型クラスに対してderivingできる
data
の場合5種のみだったことに対照的
例えば、 Score Int
をnewtypeで作ったとき
Int
がinstanceとして定義されている型クラスはderivingできる
Int
は Semiring
のinstanceなので以下のように書ける
purs(hs)newtype Score = Score Int
derive newtype instance Semiring Score
型引数に制約がある場合
purs(hs)derive newtype instance Eq (f a) => Eq (Alternate f a)
勿論Genericもderivingできる
そうなると、Genric経由するかどうかの差異が気になってくる
refpurs(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される