F #: Проблемы при возврате списка списков через сопоставление с образцом? - PullRequest
0 голосов
/ 31 мая 2018

Итак, у меня есть этот код, который в основном разделит список на k элементов.Так что если есть список [1; 2; 3; 4; 5; 6; 7], и я хочу разделить первые k = 3 элемента, то он разделит список на [1; 2; 3] и [4; 5; 6; 7].

Я хочу вернуть оба из них, поэтому я планирую поместить их в список списков, ИЛИ было бы еще лучше поместить их в кортеж из 2 списков.Итак, я возвращаюсь [[1; 2; 3];[4; 5; 6; 7]] или ([1; 2; 3], [4; 5; 6; 7]).

Я также попытался сделать это, превратив два списка в кортежи,но я не мог понять, как вернуть пустые кортежи списков для последнего совпадения с образцом.

Кроме того, я знаю, что это можно сделать проще с помощью некоторой функции .take или .split, но я 'Я пытаюсь понять F #, поэтому я делаю это так.

Но, пожалуйста, помогите!Моя ошибка: ожидал '' a '
, но получил' 'список'

let populateList k =
  let data = [1;2;3;4;5;6;7]
  let rec helper count aList =
    match aList with
    | head::tail when count < k ->
        let theTail = tail
        let newList = head :: helper (count+1) tail
        //let aTuple = (theTail,newList)
        //aTuple
        [theTail; newList]
    | _ -> []
    helper 0 data

 populateList 3

1 Ответ

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

Вспомогательная функция должна отслеживать оба списка результатов для работы в рекурсивной конструкции.Вот пример:

let populateList k =
  let data = [1;2;3;4;5;6;7]
  let rec helper count (first_k, rest) =
    if count < k then
        match rest with
        | a::tail -> helper (count+1) (a::first_k, tail)
        | _ -> ([],[])
    else (first_k |> List.rev, rest)
  helper 0 ([], data)

populateList 3
...