まだ実装されているOverloadedRecordFields
に興味があります。
現在の実装は、あまりにも多くの新しいものを一度に導入しないように、故意に不自由なものです。記録投影型を推測すると、厄介な虫(これは前述の拡張が扱う)を開くことができます。
field
の種類が今何をすべきですか?次のGHCiの相互作用
ghci> data Record1 = Record1 { field :: Int }
ghci> data Record2 = Record2 { field :: Bool }
ghci> :t field
を考えてみましょうかどういうわけか、「field
というフィールドを持つレコード」の概念を取り込む方法が必要です。このため、OverloadedRecordFields
は新しいビルトイン型クラス
を紹介する新しいモジュールGHC.Records
は、次のように定義しています
class HasField (x :: k) r a | x r -> a where
getField :: r -> a
HasField x r a
制約がx
が属する タイプa
の分野であるという事実を表していますレコードタイプr
に変更します。 getField
メソッドは、 レコードセレクタ関数を提供します。
次に、上記の例から、次のインスタンスがGHCによって魔法のように生成されたかのようになります(実際には実際には起こりませんが、最初の近似になります)。
instance HasField "field" Record1 Int where
getField (Record1 f) = f
instance HasField "field" Record2 Bool where
getField (Record2 f) = f
興味がある場合は、この提案を読むことをおすすめします。私が言及していないもう1つの機能は、IsLabel
クラスです。このすべてが実装されたら(レコードを更新するためにもう少し)、私はget my lenses for freeにできることを楽しみにしています(したがって、アンダースコアで始まり、makeLenses
のTemplateHaskell
を有効にするフィールド名の宣言を止めることができます)。
ghcの今後のリリースでこれを行うことはできますか? – Larry
おそらく彼らはそれを働かせる方法を見つけることができなかったでしょう。 – immibis