RecordDotSyntax
GHC-9.2.1
HaskellのRecordで、PureScriptのRecordのようにhoge.xでアクセスできるなど
RecordDotSyntaxはproposal時の名前で、
OverloadedRecordDotとOverloadedRecordUpdateという拡張名で入った
proposal
PR
けっこう色々な構文拡張が入っているっぽい
ghc-proposals/0282-record-dot-syntax.rst at master · ghc-proposals/ghc-proposals
でもまあ、実際の利用時はそんなこと気にせずPureScript感覚で使えるはずmrsekut.icon
例 ref
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 :: Class -> Status
getResults = map (.result) -- selector
getTerms :: Class -> Quarter
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
関連
HasField型クラス
参考
RecordDotSyntaxのあれこれ - Speaker Deck
提案時の話などがまとまっている
2019年の資料