Сопоставление с образцом в остальной части списка - PullRequest
0 голосов
/ 15 февраля 2019

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

let countriesInChart (cht: chart) = 
  match cht with
  | [] -> []
  | (x,y)::tt -> [x;y]
;;

Но, естественно, это относится только к первой паре в списке и просто возвращает ["countryA"; "countryB"] без остальной части списка.

Спри рекурсивном вызове просто возвращается пустой список:

let rec countriesInChart (cht: chart) = 
  match cht with
  | [] -> []
  | (x,y)::tt -> [x;y]::countriesInChart tt 
;;

Как сделать рекурсивный вызов таким, чтобы все пары в списке возвращались в виде списка?

1 Ответ

0 голосов
/ 15 февраля 2019

У вас есть это:

[x;y] :: countriesInChart tt

Это говорит о том, чтобы добавить новый список из двух элементов в начало списка списков.

Я не думаю, что вы хотите списоксписков, вы просто хотите список.Таким образом, вам не следует составлять список из двух элементов.

Если x и y имеют одинаковый тип (как я подозреваю, что они есть), то, что вы, вероятно, хотите, это:

x :: y :: countriesInChart tt

Это говорит о добавлении x и y по отдельности в начало рекурсивно сгенерированного списка.

Вы также можете написать это, что полностью эквивалентно:

[x; y] @ countriesInChart tt

Однако, это создает список из двух элементов только для того, чтобы выбросить его.Так что это небольшая дополнительная работа без пользы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...