generated at
PureScriptのderiving


ここにも書いてるが内容はほぼ同じ(やや簡素)



data 型に対するderiving ref
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 ref
wrapしている型が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経由するかどうかの差異が気になってくる ref
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される