F #: ошибка при создании списка размером n - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь создать список размером n, вытягивая элементы из большего, уже созданного списка.Я получаю сообщение об ошибке: это значение не является функцией и не может быть применено.Неполный шаблон соответствует этому выражению.Например, значение «[]» может указывать случай, не охватываемый шаблоном (ами).на 7,16

Может кто-нибудь помочь понять, что я делаю не так?Кроме того, я пытаюсь понять F #, поэтому я действительно не хочу ничего, что могло бы сделать то, что я прошу за меня, если только это не FYI.Но я все же хотел бы помочь в создании функции для этого.

//create a list of size n from beginning of a dataset
let populateList n =
    let starterList = []
    let data = [1;2;3;4;5;6;7;8]
    let rec helper count aList = 
        let head::tail = aList
        if count < k then head :: helper count+1 tail else []


    helper 0 data

populateList 3

1 Ответ

0 голосов
/ 31 мая 2018

Не удается запустить из-за этого:

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
    | _ -> []
...