そこで、陽気な一連のイベントで、 FParsecソースをダウンロードしてビルドしようとしました。残念ながら、新しい1.9.9.9とは互換性がありません。簡単な問題を修正しましたが、まだ機能しない識別された共用体がいくつかあります。
具体的には、Don Symeの投稿では、オブジェクトは比較をサポートせず、関数も同等性をサポートしていないため、型のアイテムを含む、obj
または自動的に同等性または比較制約を取得しない識別された共用体について説明しています。->
(自動生成された等式/比較が以前はバグがあったかどうかは明らかではありませんが、コードは生成されなくなったため、コンパイルすらされません。)
問題のあるDUの例を次に示します。
type PrecedenceParserOp<'a,'u'> =
| PrefixOp of string * Parser<unit,'u> * int * bool * ('a -> 'a)
| others ...
type ErrorMessage =
| ...
| OtherError of obj
| ...
問題のある使用法は次のとおりです。
member t.RemoveOperator (op: PrecedenceParserOp<'a, 'u>) =
// some code ...
if top.OriginalOp <> op then false // requires equality constraint
// etc etc ...
または、比較制約の場合
let rec printMessages (pos: Pos) (msgs: ErrorMessage list) ind =
// other code ...
for msg in Set.ofList msgs do // iterate over ordered unique messages
// etc etc ...
私が知る限り、各インスタンスに一意のintをタグ付けするドンのソリューションは、カスタムの等式/比較制約(または、DUの個々のブランチを順序付けることができるように一意のintタプル)を実装する正しい方法です。しかし、これはDUのユーザーにとっては不便です。現在、DUの構築には、次のスタンプを取得するための関数を呼び出す必要があります。
タグ取得を非表示にして、ライブラリのユーザーに同じコンストラクターを提示する方法はありますか?つまり、インターフェイスを変更せずに実装を変更するには?これは(コードについて私が理解していることから)PrecedenceParserOp
パブリックタイプであるように見えるため、特に重要です。