RecordDotSyntax
RecordDotSyntaxはproposal時の名前で、
けっこう色々な構文拡張が入っているっぽい
でもまあ、実際の利用時はそんなこと気にせずPureScript感覚で使えるはずmrsekut.icon
code:hs
data Quarter = Fall | Winter | Spring
data Status = Passed | Failed | Incomplete | Withdrawn
data Taken =
Taken { year :: Int
, term :: Quarter
}
data Class =
Class { result :: Status
, taken :: Taken
}
getResult :: Class -> Status
getResult c = c.result -- get
setResult :: Class -> Status -> Class
setResult c r = c{result = r} -- update
setYearTaken :: Class -> Int -> Class
setYearTaken c y = c{taken.year = y} -- nested update
getResults = map (.result) -- selector
getTerms = map (.taken.term) -- nested selector
updateするときって、c {result = r}のようにcと{の間にスペース入れたらダメ?
難しそうな点
既存の関数合成の.などがあるので、「.の周囲の空白の有無」で意味が変わる
でもまあ既にqualifiedのHoge.hogeのようなsyntaxが既にあるのでそんなに気にすることないかもしれない
こんな感じになる
table:aa
f . g 関数合成
f. g 関数合成
f .g syntax error
f.g field access
試してないし、プロポーザルを真面目に読んだわけじゃないので合っているか知らんmrsekut.icon
こうやって見ると確かにちょっとむずかしいかもしれない
実際、関数合成をf.gのようにスペースなしで書いているコードたまに見かけるしmrsekut.icon
関連
参考
提案時の話などがまとまっている
2019年の資料