NoFieldSelectors
何が変わるのか
NoFieldSelectors
を使わない通常のRecordでは
hsdata Foo = FooC { baz :: Int }
このような型を定義すると以下のものが導入される
① 型 Foo
② Constructor Fooc
③ 構築の為の baz
④ 更新の為の baz
hsupdate :: Foo -> Int -> Foo
update foo newId = foo { baz = newId }
これって、言語的には③と同じなのかな

⑤パターンマッチの為の baz
hspatt = \case
Foo { baz = 1 } -> ...
...
⑥ getterの為の baz
hsget :: Foo -> Int
get = baz
NoFieldSelectors
を有効にすると、⑥が無効化される
何が嬉しいのか
getterを無効化するので、そのfieldの値にはアクセスできなくなる
それは困るので、他の拡張と併用して使うことになる
exportとの兼ね合い
もし、NoFIeldSelectorsによって↑この辺が不要になるのであれば、その旨の各ノートにメモっておきたい
この辺の拡張がどういうものなのか知らないのでわからない

参考