运算符使用seq <'T>重载

Tal*_*age 3 f# operator-overloading

在我正在试验的项目中,我不断地增加序列元素.我想创建一个这样的运算符:

let (.*) (a:seq<'T>) (b:seq<'T>) = Seq.map2 (*) a b
Run Code Online (Sandbox Code Playgroud)

但是,在FSI中它返回:

val ( .* ) : a:seq<int> -> b:seq<int> -> seq<int>
Run Code Online (Sandbox Code Playgroud)

以下失败:

  seq [1.0;2.0] .* seq [3.0;4.0];;
  -----^^^

stdin(16,6): error FS0001: This expression was expected to have type
    int    
but here has type
    float 
Run Code Online (Sandbox Code Playgroud)

如何让操作符在通用seq <'T>上工作(提供'T支持乘法)?

The*_*ght 6

您需要将inline关键字添加到运算符声明中,以便在编译时解析正确的重载:

let inline (.*) (a:seq<'T>) (b:seq<'T>) = Seq.map2 (*) a b
Run Code Online (Sandbox Code Playgroud)
val inline ( .* ) : a:seq< ^T> -> b:seq< ^T> -> seq< ^a> when  ^T :  (static member ( * ) :  ^T *  ^T ->  ^a)
Run Code Online (Sandbox Code Playgroud)