PureScriptのRecord
JavaScriptのobjectに対応する
syntaxもJSのobject literalと同じ
Recordはいろいろな型クラスのinstanceになっている
refだからRecordのまま、 =
での比較や、数値演算、論理演算などができる
kind
purs(hs)data Record :: Row Type -> Type
以下2つは同じ
purs(hs)type Person = Record (name :: String, age :: Number)
purs(hs)type Person = { name :: String, age :: Number }
後者で書かれることが多い
{ xyz }
は Record (xyz)
に脱糖される
purs(hs)> showPerson { first: x, last: y } = y <> ", " <> x
> :t showPerson
forall r. { first :: String, last :: String | r } -> String
showPersonの引数は、以下のいずれも通す
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かつ &
みたいなやつ
purs(hs)type Record1Poly r = { y :: String | r }
type Record1 = Record1Poly Common
genericにしなくともこれでもいい
purs(hs)type Record1= { y :: String | Common }
fieldへのアクセス
.
でする
spago> foo = {x:1, y:4}
> foo.x
1
アクセスする関数を作る
Recordの更新
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同士の差分