generated at
OverloadedRecordFields
HaskellのRecordの問題点を解決するためのGHC拡張の提案
具体的に言うと、「複数のRecordで、同じfieldを使いたい」という課題を解決するための提案
最終的には3つに分割されたので、この名前の拡張は存在しない



歴史的にはこういう流れ
いつの提案なのか具体的な日付がわからん #??
OverloadedRecordFieldsの元になったProposal
Recordが定義されたら、Has型クラスのinstanceを自動生成しする
hs
data T a = T1 { x :: a, y :: Bool } | T2 { x :: a } class Has (r :: *) (f :: String) (t :: *) where get :: r -> t instance (t~a) => Has (T a) "x" t where get (T1 x _) = x get (T2 x) = x instance (t~Bool) => Has (T a) "y" t where get (T1 _ y) = y
利用時は r.x と書くと、内部では get @ T _ @ "x" @ _ r とみなしてアクセスする
2021/2/18
hs
data Customer = Cust{ customer_id :: Int, ... } class Has r fld t where get :: r -> fld -> t set :: fld -> t -> r -> r instance (t ~ Int) => Has Customer Proxy_customer_id t where get Cust{ customer_id } _ = customer_id set _ x Cust{ .. } = Cust{ customer_id = x, .. }
r.x でアクセスする
OverloadedRecordFieldsの1回目の提案 ref
2013
OverloadedRecordFieldsの2回目の提案 ref
2015
要約記事
重複するfieldを持つRecordが定義された時点では、field名のconflictのチェックを延期する
利用時に型を指定することでどうにかする
#userId とすることで多相なselectorが得られる
hs
getId :: r { personId :: Int } => r -> Int getId x = #personId x
Row polymorphismみがあるなmrsekut
この提案は大きいので以下の3つに分割された


参考