2016-12-07 22 views
7

関連のポスト:How to disambiguate selector function?なぜDuplicateRecordFieldsに型推論ができないのですか?

https://ghc.haskell.org/trac/ghc/wiki/Records/OverloadedRecordFields/DuplicateRecordFields

しかし、我々はデータ型を決定するために、引数の型を推論、または制約ソルバに選択肢を延期する任意の方法を持っていません。

実際にはこの機能は実装されていません。私は複数のソースを調べようとしましたが、タイプを推測しない理由を見つけることができませんでした。

誰にもこの理由がわかりますか?それは現在のタイプのシステムの限界のためですか?

+0

ghcの今後のリリースでこれを行うことはできますか? – Larry

+0

おそらく彼らはそれを働かせる方法を見つけることができなかったでしょう。 – immibis

答えて

9

まだ実装されている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にできることを楽しみにしています(したがって、アンダースコアで始まり、makeLensesTemplateHaskellを有効にするフィールド名の宣言を止めることができます)。

関連する問題