2016-05-03 43 views
5

Contesto: sto usando il .net/C# -library Fare in F # e cerco di usare per esempio Map.ofSeq. Ciò non riesce poiché Fare.State non supporta il confronto poiché non implementa l'interfaccia System.IComprable (FS0001).F #: Aggiunta di un'interfaccia (come IComparable) per un tipo esistente (ad esempio, da una libreria come tariffa)

Nella mia ingenuità, ho cercato di aggiungere il interface IComparable in questo modo:

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" 

Questo però non è possibile su come F # richiede le interfacce implementate devono essere dichiarati sulla dichiarazione iniziale del tipo (FS0909).

Pensai alle seguenti opere-around:

  1. L'introduzione di un involucro di tipo che include un Fare.State come il suo unico attributo e implementa IComparable
  2. Memorizzazione del ID invece che l'attuale Fare.State e utilizzare una mappa per tradurre allo stato attuale dove necessario
  3. Utilizzare qualche trucco per aggiungere interface IComparable al tipo esistente.

Se la terza opzione è impossibile, quale opzione è più appropriata? Ci sono altre opzioni?

+7

Può un'opzione * 4 * essere aprire una richiesta di pull in [Fare] (https://github.com/moodmosaic/Fare) proponendo di implementare tale interfaccia? –

+0

Non sono del tutto sicuro che gli sviluppatori di C# siano molto interessati ad aggiungere codice per rendere più facile la vita degli amici di F #. – fsharpnoob

+1

Fare 'State' * fa * implementa' IComperable' sebbene [(source)] (https://github.com/moodmosaic/Fare/blob/f453ef1ef07f1f9e52851239a8aa477ef86ea1f1/Src/Fare/State.cs#L44). –

risposta

6

Mentre il tipo State implementa (generico) IComparable<'T>, ciò che F # cerca nel vincolo di confronto è (non generico) IComparable. Il fatto che il primo non sia un sottotipo di quest'ultimo sembra una deplorevole scelta di design, ma è qui per restare.

Le soluzioni 1 e 2 hanno senso per me. Dal punto di vista del design, preferirei un semplice wrapper di record intorno a State. Ma se gli ID sono unici, è ipotizzabile procedere con l'altra soluzione, anche se un po 'goffa.

+0

'Id' è unico. In effetti, il confronto si basa su 'Id' ([fonte] (https://github.com/moodmosaic/Fare/blob/master/Src/Fare/State.cs#L223)) – fsharpnoob

Problemi correlati