怎么做运算符重载?

时间:2010-08-25 08:11:37

标签: f# operator-overloading

我这样做了:

let (-) (m:float[]) (n:float[])=  [| for i = 0 to Array.length m - 1 do yield m.[i]-n.[i] |]

但是,为什么这是错的?!

let y=1.0-0.0

之前没关系!

Error   1   This expression was expected to have type     float []     but here has type     float      E:\MyDocuments\Visual Studio 2010\Projects\curve intersection\newton\Module1.fs 28  7   newton
Error   2   This expression was expected to have type     float []     but here has type     float      E:\MyDocuments\Visual Studio 2010\Projects\curve intersection\newton\Module1.fs 28  11  newton

我认为(m:float [])(n:float [])设置参数类型,为什么1.0-0.0,float float,不去使用( - )float float- >浮子???

2 个答案:

答案 0 :(得分:7)

您完全重新定义了-运算符。

如果您想扩充一个自己的类型以使用-,您可以这样做(内置运算符定义将选择某个类型的成员)。但我认为没有办法在内置/现有类型上定义现有的运算符,这些运算符不会完全影响内置运算符定义。

您可以使用本地let绑定临时隐藏-以处理浮点数组,也可以改为定义新运算符。例子:

// locally shadow
let f() =
    let (-) (a:float[]) (b:float[]) = ...
    // use (-) on arrays for a moment
// use (-) as normal

// new operator
let (-@) (a:float[]) (b:float[]) = ...
[|1.0|] -@ [|2.0|]  // my new op
1.0 - 2.0           // minus as normal

答案 1 :(得分:1)

您为类型float[]添加了运算符重载。在示例代码中,您尝试使2个float值不起作用。请尝试以下

let y = [|1.0|] - [|0.0|]

[| ... |]语法用于创建值数组。在上述情况下,它会创建两个float[],每个float一个{{1}}值。