Удалить первые элементы во вложенном списке в F #? - PullRequest
0 голосов
/ 03 октября 2018

Я хочу удалить первые элементы из вложенного списка.Я только что узнал о List.map и List.filter, но не могу заставить его работать.

Итак [[1; 2; 3];[4; 5; 6]] становится [[2; 3];[5; 6]

Может кто-нибудь намекнуть мне в правильном направлении?

Версия 1:

let remove l =

for i in l do
    printfn "i %A" i
    for j in i do 
        printfn "%A" j
        List.map (fun x -> x) j


printfn "done"


printfn "%A" (remove ([[1;2;3]; [4;5;6]]))

Версия 2:

let remove1 l = 

  for i in l do
     printfn "i %A" i
     List.map (fun x -> x.[2..]) j


printfn "%A" (remove1 ([[1;2;3]; [4;5;6]]))

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

С уважением

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Вы используете for ... do, но это для императивного кода (например, для каждого элемента в списке выполните этот побочный эффект).

То, что вы хотите, это функция, которая принимает в списке,и возвращает список, где каждый элемент был преобразован.(Здесь элементы являются подсписками, и преобразование «удалить первый элемент из списка»).Вот для чего List.map: List.map transformation lst возьмет список lst, выполнит преобразование для каждого элемента и создаст новый список со значениями, возвращенными из преобразования.(Преобразование должно быть функцией, которая принимает исходный элемент и возвращает новое значение).

Теперь, как мы уже говорили, преобразование, которое вы хотите применить, состоит в том, чтобы взять список и вернуть его минус его первоевещь.Это может быть выражено как fun lst -> List.tail lst, поэтому ваша карта будет выглядеть как List.map (fun innerList -> List.tail innerList) outerList.Однако всякий раз, когда вы видите fun x -> someFun x, это выражение можно просто заменить на someFun.Таким образом, вызов List.map становится простым:

List.map List.tail outerList

Или, выраженным в виде функции:

let removeFirst outerList = List.map List.tail outerList

И здесь мы можем использовать стиль программирования, называемый «бессмысленным» стилем (Если вы не знакомы с лямбда-исчислением, имя «без точек» может ввести в заблуждение, поэтому подумайте о нем как о стиле «без параметров», чтобы еще больше упростить это выражение:

let removeFirst = List.map List.tail

И такмы пришли к (довольно правильному) решению, которое разместил @dumetrulo.Тем не менее, для начинающих стиль «без точек» может сбивать с толку, поэтому я рекомендую немного более подробно рассказать о своих параметрах, чтобы при последующем чтении этого кода вы понимали, что removeFirst является функцией, а незначение.Поэтому я бы рекомендовал написать вашу функцию как:

let removeFirst outerList = List.map List.tail outerList
0 голосов
/ 03 октября 2018

Итак, у вас есть список списков, и вы хотите удалить первый элемент каждого подсписка.Если мы предположим, что все подсписки имеют хотя бы 1 элемент, мы можем использовать List.tail в каждом подсписке, чтобы получить его хвост (т. Е. Список без первого элемента), а затем использовать его как функцию отображения, отображающую внешний список с помощью * 1002.*:

let removeFirst = List.map List.tail

Да, это действительно так просто!

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