Вы используете 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