我这样做了:
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- >浮子???
答案 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}}值。