¿Cómo funciona la sobrecarga de operadores globales no idiomáticos?

Quiero entender el código deesta responder

type Mult = Mult with
    static member inline ($) (Mult, v1: 'a list) = fun (v2: 'b list) -> 
        v1 |> List.collect (fun x -> v2 |> List.map (fun y -> (x, y))) : list<'a * 'b>
    static member inline ($) (Mult, v1:'a      ) = fun (v2:'a) -> v1 * v2 :'a

let inline (*) v1 v2 = (Mult $ v1) v2

F # puede resolver miembros sobrecargados. (Porque no admite curry de miembros). Entonces, supuse, también debería funcionar para los métodos

Pero no lo hace:

type Mult = Mult with
        static member inline Do (Mult, v1: 'a list) = fun (v2: 'b list) -> 
            v1 |> List.collect (fun x -> v2 |> List.map (fun y -> (x, y))) : list<'a * 'b>
        static member inline Do (Mult, v1:'a      ) = fun (v2:'a) -> v1 * v2 :'a
    let inline (<.>) v1 v2 = (Mult.Do (Mult,v1)) v2

No se pudo determinar una sobrecarga única para el método 'Do' en función de la información de tipo anterior a este punto del programa. Puede ser necesaria una anotación de tipo. Candidatos: miembro estático Mult.Do: Mult: Mult * v1: ^ a -> (^ a -> ^ a) when ^ a: (miembro estático (*): ^ a * ^ a -> ^ a), miembro estático Mult.Do: Mult: Mult * v1: 'una lista -> (' b lista -> ('a *' b) lista)

La sintaxis en que operador$ se define es confuso. Acepta el identificador de mayúsculas como primer argumento del operador y Visual Studio no se queja de ello.

Se infiere que Mult es de tipo mult, pero sorprendentemente esto no funciona:

type Mult = Mult with
    static member inline (!!) (mlt:Mult, v1: 'a list) = fun (v2: 'b list) -> 
        v1 |> List.collect (fun x -> v2 |> List.map (fun y -> (x, y))) : list<'a * 'b>
    static member inline (!!) (mlt:Mult, v1:'a      ) = fun (v2:'a) -> v1 * v2 :'a

let inline (<!>) v1 v2 = (Mult !! v1) v2

error FS0003: este valor no es una función y no se puede aplicar

Respuestas a la pregunta(1)

Su respuesta a la pregunta