OverloadedRecordFields
具体的に言うと、「複数のRecordで、同じfieldを使いたい」という課題を解決するための提案
最終的には3つに分割されたので、この名前の拡張は存在しない
歴史的にはこういう流れ
Recordが定義されたら、Has型クラスのinstanceを自動生成しする code: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
code: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でアクセスする
2013
2015
要約記事
重複するfieldを持つRecordが定義された時点では、field名のconflictのチェックを延期する
利用時に型を指定することでどうにかする
#userIdとすることで多相なselectorが得られる
code:hs
getId :: r { personId :: Int } => r -> Int
この提案は大きいので以下の3つに分割された
参考