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支持乘法)?
您需要将inline
关键字添加到运算符声明中,以便在编译时解析正确的重载:
let inline (.*) (a:seq<'T>) (b:seq<'T>) = Seq.map2 (*) a b
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)val inline ( .* ) : a:seq< ^T> -> b:seq< ^T> -> seq< ^a> when ^T : (static member ( * ) : ^T * ^T -> ^a)