¿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