HaskellのRecordの問題点の解決策の遍歴
HaskellのRecordの問題点
#WIP
今までの拡張の遍歴と現在どうなっているのか、知らないと、
色々な記事がごったで出てくるので、
有象無象の解決策があるように見えて困るmrsekut.icon*2
今までの時代の流れを知っておきたい
結局GHC9.2.1時代のベスプラは?
DuplicateRecordFieldsで同じfieldのRecordをいくつか定義して、
NoFieldSelectorsでgetterを無効にし、
OverloadedRecordDotでアクセスする
という感じなのかな?
#??
9.2.1の拡張を使えばExtensible recordは不要になるのかどうか
GHC 9.2に入るNoFieldSelectorsの解説記事のこの言い回し
他の言語と遜色ないレコード操作が可能になり、レコード自体の採用率も高まることが予想される ref
なるほどmrsekut.icon
Recordが渋いから、あまりRecord使わずにHoge a b c d eのような型で定義しよう、みたいなノリがあったりしたのかな
これをすると、順序を間違えるなどの問題が生じうる
また、こういう複数ConstructorのRecordはバッドプラクティスだた
code:hs
data Hoge = A { id :: Int }
| B { id :: Int }
これみたいに名前がかぶっていると、getterとしてのidが機能しなくなる
https://github.com/kakkun61/slide/blob/master/gotanda.hs-1/PITCHME.md
関係するのはどれ?
OverloadedRecordFieldsが提案された
大きいので3つに分割された
DuplicateRecordFields (8.0.1)
OverloadedLabels (8.0)
Magic Type Classes (8.2)
8.10.1
Add setField to HasField
https://gitlab.haskell.org/ghc/ghc/-/issues/16232
9.2
RecordDotSyntax
OverloadedRecordDot
9.2.1
NoFieldSelectors
たぶんあまりかんけいない?
DisambiguateRecordFields
6.8.1
https://ghc.gitlab.haskell.org/ghc/doc/users_guide/exts/disambiguate_record_fields.html
NamedFieldPuns
RecordWildCards
TraditionalRecordSyntax
PatternSynonyms
この問題に対する解決法
GHC拡張を使わずに頑張る、あるいは妥協
GHC拡張
Lens
extensible record
GHC拡張を使わない解決法、あるいは妥協
あるいは外部packageを使うのがデファクトという結論なのであればそれでもいい
この問題と、この拡張と、extensible record packageの関係
どうでもいいっちゃどうでもいいが、このDuplicateRecordFieldsとかもちゃんと使われるんだ〜みたいなのを知りたい
extensible recordの選定