F# SRTP doesn't work for overloaded methods?

64 views Asked by At

SharpLab

My actual use case has nothing to do with DateTime. I want to call multiple overloaded methods defined on a builder struct. They are call path dependent, return a modified this struct. So I can't pass the builder as two arguments with two independent generic types.

Have I overlooked something straightforward, or should I file a bug report?

open System


[<Struct>]
type MyDateTime =
  member x.Subtract(_: TimeSpan) = x
  member x.Subtract(_: DateTime) = TimeSpan(1L)


let inline f< ^DT when
        ^DT: (member Subtract: TimeSpan -> ^DT) and
        ^DT: (member Subtract: DateTime -> TimeSpan)
        >(dt: ^DT, ts: TimeSpan, dt1: DateTime) =
    let mutable dt = dt
    dt <- (^DT: (member Subtract: TimeSpan -> ^DT) dt, ts)
    (^DT: (member Subtract: DateTime -> TimeSpan) dt, dt1)
    
printfn "%A" <| f(MyDateTime(), TimeSpan(1L), DateTime(1L))
printfn "%A" <| f(DateTime.UtcNow, TimeSpan(1L), DateTime(1L))

(F# 7 SRTP improvements are not available on SharpLab, but that's not the point.)

0

There are 0 answers

Related Questions in F#