2010-08-25 4 views
3
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 \ кривая пересечения \ ньютон \ 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) 

вызывает функцию f с аргументом -1 (унарный минус). В то время как

n - 1 

и

n-1 

являются вычитанием.

Ошибка компилятор отражает

Array.length m -1 

разбирает, как

(Array.length m)(-1) 

, как будто он ожидает, что первое выражение возвращает функцию, которая будет применяться к значению -1. Поскольку длина фактически возвращает int, вы получаете сообщение об ошибке, в котором говорится, что целое число не является функцией и не может быть применено к аргументу -1.

+1

В качестве редакционной части, я думаю, что это единственное место, где я нахожу значительные пробелы, чтобы удивлять/раздражать. В каждом другом случае мне это нравится. – Brian

+0

Возможно, если бы я нашел время, чтобы написать подробные ответы, люди бы приняли их больше. :) – ChaosPandion

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

1

Формат вашего понимания по списку/массиву неправильный.

вы либо использовать -> как кратчайшим:

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

или формально написать yield:

[| for i in a do yield i |] 
Смежные вопросы