PureScriptのRecord
JavaScriptのobjectに対応する
syntaxもJSのobject literalと同じ
Recordはいろいろな型クラスのinstanceになっている ref だからRecordのまま、=での比較や、数値演算、論理演算などができる
kind
code:purs(hs)
data Record :: Row Type -> Type
以下2つは同じ
code:purs(hs)
type Person = Record (name :: String, age :: Number)
code:purs(hs)
type Person = { name :: String, age :: Number }
後者で書かれることが多い
{ xyz }はRecord (xyz)に脱糖される
code:purs(hs)
showPerson { first: x, last: y } = y <> ", " <> x
:t showPerson
forall r. { first :: String, last :: String | r } -> String
showPersonの引数は、以下のいずれも通す
code:purs(hs)
showPerson { first: "hoge", last: "piyo" }
showPerson { first: "hoge", last: "piyo", a: "poyo" }
showPerson { first: "hoge", last: "piyo", a: "poyo", b: "fuga" }
要はStringのfirstとlastさえ持っていればどんなrecordも受け付ける
拡張できる
tsでのgenericsかつ&みたいなやつ
code:purs(hs)
type Record1Poly r = { y :: String | r }
type Record1 = Record1Poly Common
genericにしなくともこれでもいい
code:purs(hs)
type Record1= { y :: String | Common }
fieldへのアクセス
.でする
code:spago
foo = {x:1, y:4}
foo.x
1
アクセスする関数を作る
Recordの更新
code:spago
piyo = { x: 12, y: {z: 20}}
piyo { x = 30}
{ x: 30, y: { z: 20 } }
piyo {y {z= 100}}
{ x: 12, y: { z: 100 } }
nestもいける
piyo {y {z= 100}}であって、 piyo {y: {z= 100}}ではない
「更新時は:は使わない」とおぼえておけば大丈夫
更新する関数を作る
関連
参考
Record同士の差分