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:
- L'introduzione di un involucro di tipo che include un
Fare.State
come il suo unico attributo e implementaIComparable
- Memorizzazione del ID invece che l'attuale
Fare.State
e utilizzare una mappa per tradurre allo stato attuale dove necessario - Utilizzare qualche trucco per aggiungere
interface IComparable
al tipo esistente.
Se la terza opzione è impossibile, quale opzione è più appropriata? Ci sono altre opzioni?
Può un'opzione * 4 * essere aprire una richiesta di pull in [Fare] (https://github.com/moodmosaic/Fare) proponendo di implementare tale interfaccia? –
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
Fare 'State' * fa * implementa' IComperable' sebbene [(source)] (https://github.com/moodmosaic/Fare/blob/f453ef1ef07f1f9e52851239a8aa477ef86ea1f1/Src/Fare/State.cs#L44). –