Как сделать перегрузку оператора? - PullRequest
1 голос
/ 25 августа 2010

Я сделал это:

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 ]

7 голосов
/ 25 августа 2010

Вы полностью переопределили оператор -.

Если вы хотите расширить один из ваших собственных типов для работы с -, вы можете сделать это (определения встроенного оператораподберем членов по виду).Но я не думаю, что есть какой-либо способ определить существующие операторы для встроенных / существующих типов, который не полностью затеняет определение встроенного оператора.

Вы можете использовать локальную let привязку для временной тени * 1010.* для работы с массивами с плавающей точкой, или вы можете определить новый оператор вместо этого.Примеры:

// 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 голос
/ 25 августа 2010

Вы добавили перегрузку оператора для типа float[]. В примере кода вы пытаетесь подчинить 2 float значениям, которые не работают. Попробуйте следующее

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

Синтаксис [| ... |] используется для создания массива значений. В приведенном выше случае создается два float[] каждый с одним значением float.

...