PureScriptのRow型
「fieldの集合を表す型」と考えれば良さそう
e.g. (name::String, age::Int)
順序付けられていないCollection
順序を持たないので、x:xsのような「先頭を取ってくる」といった処理ができない
labelの重複も許す
用語を以下のように設定したい
Row
Row型のこと
つまり、kindがType -> Typeな型
つまり、まだ何の型変数も適用されていないRow
row, rows、あるいはRow Type
kindがRow Typeな型
0個以上のfieldの集合
rowとrowsは、fieldの個数が複数あることを明示したいときに雰囲気で使い分ける
ちなみに、Typeは具体化されていない型のことであって、Row Intとかは「rows」に含めないmrsekut.icon
field
hoge :: Stringやhoge :: "piyo"のような組
「propertyの名前」と、「property」の組
ちょっと雑だけどmrsekut.icon
label
propertyの名前
{hoge::String}というときのhoge
上のRowとrowsの違いは、
関数の文脈における、fとf(x)の差と同じような感じ
関数そのもののことを言っているのか、関数を適用した結果のことを言っているのかを区別して表記したい
じゃないと混乱するmrsekut.icon
文脈でだいたい分かるが、この辺の概念を理解してないときに混乱した
kind
code:purs(hs)
data Row :: Type -> Type
kindは実際こうなのだが、これをあまり意識しすぎないほうが良い気もするmrsekut.icon
「Recordのfieldで使うんだな~」ぐらいに見ておくのがわかりやすい
syntax
0個以上のfieldを()で括ればRow Typeになる
具体例
以下の型のkindはすべてRow Type
(s :: String)
(s :: String, b :: Boolean)
(s :: String, s :: Boolean)
名前の重複ok
() :: Row Type
0個のfieldを持つrows
型シグネチャを書かないとerrorになる
(m :: Maybe)のkindはRow (Type -> Type)
| rのrはRow型
e.g. type Lang r = { language :: String | r }
この| rとして書かれたrはrows
だから↑に対してのkindを見ると以下のようになる
code:purs
:k Lang (b :: Boolean)
Type
:k Lang -- これなんでerrorなるん???
Error
:k Lang Int -- r はrowでないといけない
Error
使い所があるのか知らんが、Rowに対してRowを取る型も定義できる
e.g. type A r = ( s :: String | r )
Rowを適用した結果Rowになる
code:purs
:k A (b::Boolean)
Row Type
:k A -- これなんでerrorなるん?
Error
:k Aは、Row Type -> Row Typeになりそうだけどerrorになる
ちなみにこういう書き方もできるっぽい
code:purs
:k (s::String | (b::Boolean))
Row Type
開いたRow型
code:purs(hs)
type R3 r = ( name :: String, age :: Number | r )
:k R3 (hoge::Boolean)
Row Type
:k R3 -- Error
:k R3 Int -- Error
:k R3 R1
Row Type
labelの重複を許す
code:purs(hs)
type M = ( hoge :: String, hoge :: Int )
p = { hoge: "hoge", hoge: 1 } :: Record M -- Error (なんで???)
重複したlabelを持つrowをできる
Row Intのようにして表記することはほぼなさそう
見たこと無いmrsekut.icon
でもこれのkindを調べることは出来る
code:purs
:k Row Int
Type
kindはTypeなので、これをRecordに適用するなどはできない
ここの歪さがListとアナロジーできない点な気がする
関連Modules
Row型を扱うための型クラス集
眺めてるとRowのできることがなんとなくわかったりわからなかったりするmrsekut.icon
Row型を使ったValidationの例
ちょっと古いかも
Row型は昔(いつ #?? )は#という記号で表現されていた kindを調べると# Typeと表示されていた
現在はRow Type
古い記事を見ると# Typeと書いているものもある
v0.14.2現在はdeprecatedになっており、警告が出る
https://gyazo.com/6adfaf95268915e0096afb5cba4c46be
Row型の使いみちは、RecordとEff
だったらしいが、今はEffは存在しないので、Recordでしか使わないはず
関連
参考
高度なものもありあまり読めてないけどmrsekut.icon