2010-08-25 103 views
3
let sub (m:double[],n:double[]) : double[]= 
    [| for i = 0 to Array.length m -1 do m.[i]-n.[i] |] 

错误1这个值不是一个函数并且不能应用于E:\我的文档\的Visual Studio 2010 \项目\曲线相交\牛顿\ Module1.fs 27 21牛顿为什么我的代码不能编译?

但是,这是确定:

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

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

回答

7

周围的空间减号事情:

f -1 // means f(-1) 

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

n - 1 

n-1 

是减法。

编译器误差反映

Array.length m -1 

解析作为

(Array.length m)(-1) 

好像它期待第一个表达式来返回一个函数,那么其将被应用到的值-1。由于长度实际上返回int,您会收到错误消息,指出整数不是函数,也不能应用于参数-1

+1

作为一个社论不谈,我认为这是唯一一个我发现有意思/烦人的空白空间的地方。在其他情况下,我喜欢它。 – Brian 2010-08-25 03:37:47

+0

也许如果我花时间写出详细的答案,人们会更多地接受他们。 :) – ChaosPandion 2010-08-25 16:59:17

3

这编译:

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

@Begtostudy - 没问题。 – ChaosPandion 2010-08-25 03:08:15

1

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

你要么使用->作为一个捷径:

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

或正式致函yield

[| for i in a do yield i |]