Как объединить список списков в один список с помощью свойства list.map - PullRequest
3 голосов
/ 03 октября 2019

Мне нужно создать один список из списка списков, используя свойство List.map в f #. Это то, что я получил до сих пор.

let lst1 = [[1;2;3;4];[5;6;7;8]]

let concat (list: 'a list list) =
    let li = []
    let q = List.map(fun (x: 'a list) -> x @ li ) list
    li


printfn "%A" (concat lst1)

Я ожидаю вывод

li = [1;2;3;4;5;6;7;8]

, но вместо этого получаю пустой список.

Я не понимаю, почемусписок пуст. Я добавляю в список li в функции List.map

Ответы [ 2 ]

3 голосов
/ 03 октября 2019

Возвращает пустой список, потому что вы возвращаете li, который вы привязали к пустому списку. Помните, что большинство значений неизменны в F #. x @ li не изменяет список, на который указывает li.

Вот что делает ваш код, выражение по выражению:

let li = []

связывает пустой список с именемli

x @ li

оценивается как x, добавленный к li, но не меняет ни один из них. И поскольку li является пустым списком, это эквивалентно просто x. Он фактически ничего не делает.

List.map(fun (x: 'a list) -> x @ li ) list

отображает каждый элемент list в соответствии с переданной ему функцией, которую мы только что решили ничего не делать. Следовательно, это просто создает однозначную копию list.

let q = ...

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

li

возвращает пустой список.

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

2 голосов
/ 03 октября 2019

Я бы обычно использовал List.concat для этой цели.

В FSI (F # REPL):

> let lst1 = [[1;2;3;4];[5;6;7;8]];;
val lst1 : int list list = [[1; 2; 3; 4]; [5; 6; 7; 8]]

> List.concat lst1;;
val it : int list = [1; 2; 3; 4; 5; 6; 7; 8]

Если вы ищете вызовнаписав это самостоятельно, вы можете посмотреть List.fold.

...