Prim.Row
rowのための型クラス制約をもりもり書いていくことで、型レベルプログラミングができる
merge関数
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が重複する可能性が普通にある
purs(hs)class Lacks (label :: Symbol) (row :: # Type)
insert関数
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関数
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 }