Не удается запустить из-за этого:
head :: helper count+1 tail
Поскольку вызовы функций имеют более высокий приоритет оператора, чем оператор infix +
, это интерпретируется как:
head :: ((helper count) + (1 tail))
Поскольку 1
не является функцией, вы получаете здесь ошибку.
Вы можете исправить это, добавив скобки:
head :: helper (count+1) tail
Предупреждение «Неполные совпадения с образцом» не помешает его запуску, но оно указывает на то, на что вам следует обратиться, поскольку это может привести к ошибке времени выполнения.
Правильный способ решения этой проблемы - использование сопоставления с образцом для охвата всех возможных рисунков:
let rec helper count aList =
match aList with
| head::tail -> if count < n then head :: helper (count+1) tail else []
| [] -> []
Это гарантирует, что вы не попытаетесь разбить пустой список на заголовок ихвост.
Поскольку эта функция теперь возвращает []
как в базовом случае, так и в случае, если aList
пусто, вы можете еще больше упростить это, используя when
и условие соответствия по умолчанию:
let rec helper count aList =
match aList with
| head::tail when count < n -> head :: helper (count+1) tail
| _ -> []