2010-08-25 38 views
1

我这样做:如何做操作符重载?

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:浮动[])(N:浮动[])被设定的参数的类型,为什么1.0-0.0,浮浮动,而不是去使用( - )浮动浮子>浮动???

回答

7

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

如果你想增加自己的自己类型的-工作之一,你可以做到这一点(内置的操作定义将拿起成员类型)。但我不认为有任何方法可以定义内置/现有类型的现有运算符,这些运算符并不完全影响内置运算符的定义。

您可以使用本地let绑定暂时影响-以处理浮点数组,或者您可以定义一个新的运算符。例子:

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

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

谢谢,这是reasion。为什么F#不喜欢C#,按类型标识参数? – Begtostudy 2010-08-25 08:23:19

+1

因为他们是不同的语言?这里有一些相互作用,我不能在评论中总结。简而言之,在F#中,let-bound标识符不能被特别重载。 – Brian 2010-08-25 08:26:22

1

您为float[]类型添加了运算符重载。在示例代码中,尽管您试图对不起作用的2 float值进行处理。请尝试以下操作

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

[| ... |]语法用于创建值数组。在上述情况下,它会创建两个各有float值的float[]

+0

没有,没有。我该怎么做“1.0-0.0”,而不是[| 1.0 |] - [| 0.0 |]。它应该是错的? – Begtostudy 2010-08-25 08:17:03

+0

这意味着您的操作员重载是错误的。它应该是'let( - )(m:float)(n:float)=' – Dykam 2010-08-25 08:23:23