【发布时间】:2016-10-03 03:25:01
【问题描述】:
我想了解this答案的代码
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:该值不是函数,不能应用
【问题讨论】:
标签: f# operator-overloading operators overloading