PureScriptのRecord
JavaScriptのobjectに対応する
syntaxもJSのobject literalと同じ
Recordはいろいろな型クラスのinstanceになっている ref
だからRecordのまま、=での比較や、数値演算、論理演算などができる
RowToList型クラスを使って実装されている ref
docs
kind
code:purs(hs)
data Record :: Row Type -> Type
型引数はPureScriptのRow型
以下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
アクセスする関数を作る
PureScriptの(_)で関数を作る#608e8afc1982700000b6eff2
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}}ではない
「更新時は:は使わない」とおぼえておけば大丈夫
更新する関数を作る
PureScriptの(_)で関数を作る#608e8afc1982700000b6eff9
関連
RowToList型クラス
参考
実例によるPureScript 5.7
実例によるPureScript 8.13, 8.14
https://qiita.com/kimagure/items/ca229cb4ba76db0c24a8
Record同士の差分