Почему мой код не компилируется? - PullRequest
3 голосов
/ 25 августа 2010
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 \ Проекты \ пересечение кривой \ newton \ 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])

Ответы [ 3 ]

7 голосов
/ 25 августа 2010

Пробелы вокруг знака минус имеют значение:

f -1   // means f(-1)

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

n - 1

и

n-1

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

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

Array.length m -1

анализируется как

(Array.length m)(-1)

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

3 голосов
/ 25 августа 2010

Это компилируется:

let sub (m:double[], n:double[]) : double[] =
    [| for i = 0 to Array.length m - 1 do yield m.[i] - n.[i] |]
1 голос
/ 25 августа 2010

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

вы либо используете -> в качестве короткого пути:

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

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

[| for i in a do yield i |]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...