当你想在你的代码中找到一个错误时,这很难;当你认为你的代码是不会有错误时,这就更难了。

f-如何进行运算符重载?

admin 136℃
我做到了:

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,floatfloat,不去使用(—)floatfloat->float???

你完全重新定义了 - 接线员。

如果你想扩充你自己的类型 - ,您可以这样做(内置运算符定义将拾取类型上的成员)。但我认为没有任何方法来定义现有的运营商在构建/现有类型上不完全屏蔽Buffin操作员定义。

你可以用本地的 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

为类型添加了运算符重载 float[] 是的。在示例代码中,尽管您正在尝试主题2 float 不起作用的价值观。尝试下列操作

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

那个 [| ... |] 语法用于创建值数组。在上面的例子中,它创建了两个 float[] 每人一个 float 价值。

转载请注明:我的代码 » f-如何进行运算符重载?