2010-08-25 40 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