1

そこで、陽気な一連のイベントで、 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パブリックタイプであるように見えるため、特に重要です。

4

2 に答える 2

2

FParsec のどのソースをダウンロードしましたか? FParsec BitBucket リポジトリから最新のものを取得しました。VS 2010 RC でコンパイルするために、FParsec ソースに変更を加える必要はまったくありませんでした。

編集:私はそれを取り戻します。InterpLexYacc および InterpFParsec サンプル プロジェクトからビルド エラーが発生しましたが、コア FParsec および FParsecCS プロジェクトは正常にビルドされます。

于 2010-02-18T19:19:28.903 に答える
1

できることの 1 つは、属性を追加[<CustomEquality>]して、独自のオーバーライドと実装[<CustomComparison>]を定義することです。もちろん、これには適切な方法でコンポーネントとコンポーネントを自分で処理する必要がありますが、それが可能である場合とそうでない場合があります。コンストラクターに渡されるものを制御できる場合は、構造的に比較可能な型に をダウンキャストすることで、型に対してこれを機能させることができるはずです。ただし、ケースは少しトリッキーです。比較も必要ない限り、関数コンポーネントで参照の等価性を使用することでうまくいく可能性があります。.EqualsIComparableobj_ -> _OtherErrorErrorMessageobjPrecendenceParserOp

于 2010-02-18T16:49:58.903 に答える