Context: I'm using the .net/c#-library Fare in F# and I try to use e.g. Map.ofSeq
. This fails as Fare.State
does not support comparision since it does not implement the System.IComprable
interface (FS0001).
In my naivity, I tried to add the interface IComparable
like this:
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"
This however is impossible as F# requires the implemented interfaces should be declared on the initial declaration of the type (FS0909).
I thought of the following works-arounds:
Fare.State
as its only attribute and implements IComparable
Fare.State
and use a Map to translate to the actual state where neededinterface IComparable
to the existing type.If the third option is impossible, which option is most appropriate? Are there other options?
While State
type does implement (generic) IComparable<'T>
, what F# looks for in comparison constraint is (non-generic) IComparable
. The fact that the former is not a subtype of the latter seems like a lamentable design choice, but it's here to stay.
Your workarounds 1 and 2 make sense to me. From a design point of view, I would prefer a simple record wrapper around State
. But if ids are unique, going with your other workaround is conceivable, if a bit clunky.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With