NoFieldSelectors
GHC-9.2.1
HaskellのRecordのfieldをgetterとして定義する機能を無効化する
proposal
https://gitlab.haskell.org/ghc/ghc/-/merge_requests/4017
@fumieval氏が実装している
何が変わるのか
NoFieldSelectorsを使わない通常のRecordでは
code:hs
data Foo = FooC { baz :: Int }
このような型を定義すると以下のものが導入される
① 型Foo
② Constructor Fooc
③ 構築の為のbaz
code:hs
foo1 = Foo { baz = 1 }
④ 更新の為のbaz
code:hs
update :: Foo -> Int -> Foo
update foo newId = foo { baz = newId }
これって、言語的には③と同じなのかなmrsekut.icon
⑤パターンマッチの為のbaz
code:hs
patt = \case
Foo { baz = 1 } -> ...
...
⑥ getterの為のbaz
code:hs
get :: Foo -> Int
get = baz
NoFieldSelectorsを有効にすると、⑥が無効化される
何が嬉しいのか
背景にはHaskellのRecordの問題点の解決策の遍歴などがある
getterを無効化するので、そのfieldの値にはアクセスできなくなる
それは困るので、他の拡張と併用して使うことになる
例えばRecordDotSyntaxとか
exportとの兼ね合い
https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0160-no-toplevel-field-selectors.rst#examples
#??
OverloadedLabelsなどの問題はどうなるかのか
もし、NoFIeldSelectorsによって↑この辺が不要になるのであれば、その旨の各ノートにメモっておきたい
この辺の拡張がどういうものなのか知らないのでわからないmrsekut.icon
参考
新しいGHC拡張、NoFieldSelectorsについて - モナドとわたしとコモナド