Anibal Yeh
Anibal Yeh

Reputation: 351

The compiler compains about static resolved parameter

    type Test<'T> =
        static member from : unit -> 'T[] = fun () -> Array.empty


    let inline testFun< ^T, ^S when ^T : (static member from : unit -> ^S [])> () =
        (^T : (static member from : unit -> ^S[]) ())

    let a = testFun<Test<int>, int> ()

I am so confused... Why it says Test< int> does not support the operator "from"?

Upvotes: 2

Views: 55

Answers (2)

Anibal Yeh
Anibal Yeh

Reputation: 351

    type Test<'T> =
        static member from () : 'T array = Array.empty

    type Test1<'T> () =
        static member from : unit -> 'T array = fun () -> Array.empty

    let inline testFun< ^T, ^S when ^T : (static member from : unit -> ^S array)> () =
        (^T : (static member from : unit -> ^S array) ())
    
    let inline testFun2< ^T, ^S when ^T : (static member from : (unit -> ^S array))> () =
        (^T : (static member from : (unit -> ^S  array)) ())

    let a1 = testFun<Test<int>, int> ()

    let a2 = testFun2<Test1<int>,int> ()

For someone if needed... Property should add a pair of quote... omg

Upvotes: 3

Fyodor Soikin
Fyodor Soikin

Reputation: 80754

The SRTP solver can't understand your static method signature, because technically it's not a method, but a property. It's a property whose type is a function unit -> 'T[], but it's not a method. I know, subtle and confusing, but there it is.

If you make it a method, everything will suddenly work:

type Test<'T> =
    static member from () : 'T[] = Array.empty

Upvotes: 3

Related Questions