为什么我的代码不能编译?

时间:2010-08-25 02:53:46

标签: f#

let sub (m:double[],n:double[]) : double[]=
    [| for i = 0 to Array.length m -1 do m.[i]-n.[i] |]

错误1此值不是函数且无法应用E:\ MyDocuments \ Visual Studio 2010 \ Projects \ curve intersection \ newton \ Module1.fs 27 21 newton

但是,这没关系:

let a = [| "a"; "b"; "c"; "d"; "e"; "f" |]

for i = 0 to Array.length a - 1 do
    System.Console.WriteLine(a.[i])

3 个答案:

答案 0 :(得分:7)

减号附近的空格:

f -1   // means f(-1)

使用参数f(一元减号)调用函数-1。而

n - 1

n-1

是减法。

编译器错误反映了

Array.length m -1

解析为

(Array.length m)(-1)

好像它期望第一个表达式返回一个函数,然后将其应用于值-1。由于length实际返回int,因此您会收到一条错误消息,指出整数不是函数,并且不能应用于参数-1

答案 1 :(得分:3)

编译:

let sub (m:double[], n:double[]) : double[] =
    [| for i = 0 to Array.length m - 1 do yield m.[i] - n.[i] |]

答案 2 :(得分:1)

列表/数组理解的格式错误。

您使用->作为捷径:

let a = [1;2;3]
[| for i in a -> i |]

或正式撰写yield

[| for i in a do yield i |]