Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 非惯用全局运算符重载是如何工作的?_F#_Operator Overloading_Operators_Overloading - Fatal编程技术网

F# 非惯用全局运算符重载是如何工作的?

F# 非惯用全局运算符重载是如何工作的?,f#,operator-overloading,operators,overloading,F#,Operator Overloading,Operators,Overloading,我想从答案中理解代码 错误FS0003:此值不是函数,无法应用 您的第二个示例不起作用,因为F#不会像使用运算符那样使用方法自动推断静态成员约束 因此,是的,这是可能的,但您必须手动编写约束,编译器不会为您推断约束: type Mult = Mult with static member inline Do (Mult, v1: 'a list) = fun (v2: 'b list) -> v1 |> List.collect (fun x -> v

我想从答案中理解代码

错误FS0003:此值不是函数,无法应用


您的第二个示例不起作用,因为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 impl m v1 v2 = ((^T or ^a) : (static member Do:^T* ^a->(^b-> ^c)) (m,v1)) v2
let inline (<.>) a b = impl Mult a b
type Mult=Mult带
静态成员内联Do(Mult,v1:'a list)=乐趣(v2:'b list)->
v1 |>List.collect(funx->v2 |>List.map(funy->(x,y))):List
静态成员内联Do(Mult,v1:'a)=乐趣(v2:'a)->v1*v2:'a
让内联impl m v1 v2=(^T或^a):(静态成员Do:^T*^a->(^b->^c))(m,v1))v2
让inline()a b=impl Mult a b
您提到的大写标识符只匹配一个大小写的区分并集,因此它将始终成功,并且大小写的名称与类型的名称相同。所有这些都是为了将代码量缩短一点,因为DU是一个伪类型。如果让人困惑,下面是一个普通类的示例:

type Mult() = class end 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
type Mult()=类以
静态成员内联($)(u:Mult,v1:'a list)=乐趣(v2:'b list)->
v1 |>List.collect(funx->v2 |>List.map(funy->(x,y))):List
静态成员内联($)(u:Mult,v1:a)=乐趣(v2:a)->v1*v2:a
让内联(*)v1 v2=(Mult()$v1)v2
您的第三个示例不起作用,因为
(!!)
是一元运算符,而不是像
($)
那样的二进制运算符

有关此旧技术的更多信息,请参阅

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
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 impl m v1 v2 = ((^T or ^a) : (static member Do:^T* ^a->(^b-> ^c)) (m,v1)) v2
let inline (<.>) a b = impl Mult a b
type Mult() = class end 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