我想了解代码this answer
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# 可以解析重载的成员。 (因为它不支持成员柯里化)。所以,我想,它也应该适用于方法
但它没有:
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
无法根据以下内容确定方法“Do”的唯一重载
在此程序点之前键入信息。类型注释可以是
需要。候选:静态成员 Mult.Do : Mult:Mult * v1: ^a -> ( ^a
-> ^a) 当 ^a : (静态成员 ( * ) : ^a * ^a -> ^a) 时,静态成员 Mult.Do : Mult:Mult * v1:'a list -> ('b list -> ('a*'b)
列表)
其中运算符的语法$
的定义令人困惑。它接受大写标识符作为运算符的第一个参数,并且 Visual Studio 不会抱怨它
Mult 被推断为 mult 类型,但令人惊讶的是这不起作用:
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
错误 FS0003:该值不是函数,无法应用