Prim.Row
rowのための型クラス制約をもりもり書いていくことで、型レベルプログラミングができる
merge関数
code:purs(hs)
merge :: forall r1 r2 r3 r4. Union r1 r2 r3 => Nub r3 r4 => { | r1 } -> { | r2 } -> { | r4 }
merge { x: 1, y: "y" } { y: 2, z: true }
-- { x: 1, y: "y", z: true }
Lacks l r1と書いた時に、rows r1に、label lが含まれていないこと、を保証する
これによって、labelの重複が起こらないことが保証される
Lacks制約がなくてもinsertはできる
しかし、labelが重複する可能性が普通にある
code:purs(hs)
class Lacks (label :: Symbol) (row :: # Type)
insert関数
code:purs(hs)
insert :: forall r1 r2 l a
. IsSymbol l
=> Lacks l r1
=> Cons l a r1 r2
=> SProxy l -> a -> { | r1 } -> { | r2 }
insert (SProxy :: SProxy "x") "x" { y: "y", z: true }
-- { x: "x", y: "y", z: true }
delete関数
code:purs(hs)
delete :: forall r1 r2 l a
. IsSymbol l
=> Lacks l r1
=> Cons l a r1 r2
=> SProxy l -> { | r2 } -> { | r1 }
delete (SProxy :: SProxy "x") { x: "x", y: "y", z: true }
-- { y: "y", z: true }