F #: создание нового списка из первого элемента во вложенном списке - PullRequest
0 голосов
/ 13 октября 2019

У меня есть назначенная проблема, когда я должен создать функцию firstColumn : lst : 'a list list -> 'a list, которая берет список списков и генерирует новый список, используя первый элемент из каждого вложенного списка. Например, firstColumn [[343;32];[11;75]] вернет новую таблицу [343;11].

До сих пор я пытался использовать цикл для добавления заголовка каждого элемента (первого элемента во вложенном списке) в новый список:

let firstColumn (lst : 'a list list) : 'a list =
  let newList = []
  for elm in lst do
    elm.Head :: newList
  newList

Однако это приводит к предупреждению FS0020, где результат elm.Head :: newList игнорируется и возвращается пустая таблица newList.

Ответы [ 2 ]

1 голос
/ 13 октября 2019

Реализуемое решение, основанное на вашем примере, опубликованном Робертом, работает отлично. Однако, если вы хотите следовать функциональному стилю, вы можете написать то же самое, используя рекурсию и сопоставление с образцом:

let rec firstColumn lst = 
  match lst with 
  | (head::_) :: lst -> head :: (firstColumn lst)
  | _ -> []

Шаблон (head::_) :: lst берет список списков, извлекает заголовок первогоlist и дает вам остальные списки как lst, так что вы можете затем рекурсивно обработать lst и добавить head вперед, как первый столбец.

0 голосов
/ 13 октября 2019

Я думаю, вы просто неправильно поняли синтаксис (не столько недоразумение, сколько достаточно, чтобы получить неверный результат). Посмотрите на этот почти похожий код и найдите различия:

let firstColumn (lst : 'a list list) : 'a list =
  let mutable newList = []
  for elm in lst do
    newList <- elm.Head :: newList
  List.rev newList

Редактировать: я понимаю, что Funk уже ответил почти на то же самое, но я подумал, что вам может пригодиться более конкретный пример исправления кода.

...