2016-05-03 5 views
5

コンテキスト:F#で.net/c#-library Fareを使用しています。 Map.ofSeq。これは、System.IComprableインターフェイス(FS0001)を実装していないため、Fare.Stateは比較をサポートしていないため失敗します。私naivityでF#:既存のタイプ(Fareなどのライブラリなど)にインターフェイスを追加する

、私はこのようなinterface IComparableを追加しようとしました:

type Fare.State with 
    interface IComparable<Fare.State> with 
     member this.CompareTo obj = 
           match box obj with 
           | :? Fare.State as other -> this.Id.CompareTo other.Id 
           | _ -> invalidArg "obj" "not a State" 

F#が実装されたインタフェースは、タイプ(FS0909)の最初の宣言で宣言されなければならない必要があり、これは、しかし、不可能です。

私は、次の作品策を考えた:その唯一の属性としてFare.Stateが含まれており、代わりに実際のFare.StateのIDを保存するIComparable

  • を実装し、地図を使用するラッパー型をご紹介

    1. 実際の状態に変換する必要がある場合
    2. interface IComparableを既存のタイプに追加するトリックを使用します。

    3番目のオプションが不可能な場合は、どのオプションが最適ですか?他のオプションはありますか?

  • +7

    5th a * 4th *オプションは、[Fare](https://github.com/moodmosaic/Fare)のプルリクエストを開いてそのインターフェイスを実装することができますか? –

    +0

    私は、c#-developersがf#-friendsの生活を楽にするコードを追加することに非常に関心があるかどうかは完全にはわかりません。 – fsharpnoob

    +1

    Fareの 'State' *は、[IComperable]を[(source)]に実装しています(https://github.com/moodmosaic/Fare/blob/f453ef1ef07f1f9e52851239a8aa477ef86ea1f1/Src/Fare/State.cs#L44)。 –

    答えて

    6

    Stateタイプは(汎用)IComparable<'T>を実装していますが、比較制約で探すF#は(非汎用)IComparableです。前者が後者のサブタイプではないという事実は、嘆かわしい設計選択のように思えますが、それはここにあります。

    回避策1と2はわかりやすいものです。デザインの観点から、私はStateの周りの単純なレコードラッパーを好むでしょう。しかし、IDがユニークであれば、少しぎこちなくすれば、他の回避策を実行することも考えられます。

    +0

    「Id」はユニークです。実際、比較は 'Id'([source](https://github.com/moodmosaic/Fare/blob/master/Src/Fare/State.cs#L223))に依存して行われます。 – fsharpnoob

    関連する問題