Как записать подсписок списка символов как [’1’; '2'; '3'; ''; ''; '4'; '5'; ''; '6'], to = [['1'; '2'; '3'] ; ['4'; '5'] ; ['6']]

В настоящее время я изучаю OCaml и не могу составить подсписок, хотя могу составить список без пробелов как ['1'; '2'; '3'; '4'; '5'; '6']. Я не смог найти источники по моему вопросу, поэтому спасибо за объяснение, пожалуйста.

type chiffre = int (*0-9*);;
type chiffreCar = char (* '0' - '9'*)
type  nombre = chiffre list;;
type txtnb =  chiffreCar list ;;

let rec les_nb (a:txtnb) : txtnb = 
  match a with
  | [] -> []
  | ' ' :: tl -> les_nb(tl)
  | hd::tl ->hd :: les_nb(tl) ;;
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Это приведет к построению списка результатов в обратном порядке, и мы получим несколько пустых списков с повторяющимися пробелами, но мы можем легко перевернуть их и отфильтровать пустые списки.

# let lst = ['1'; '2'; '3'; ' '; ' '; '4'; '5'; ' '; '6'];;
val lst : char list = ['1'; '2'; '3'; ' '; ' '; '4'; '5'; ' '; '6']
# let group lst =
    lst  
    |> List.fold_left 
         (fun i x ->
            match i, x with
            | [],    ' ' -> i
            | _,     ' ' -> [] :: i
            | [],    _   -> [[x]]
            | y::ys, _   -> (x :: y) :: ys)
         []
    |> List.filter @@ (<>) []
    |> List.rev
    |> List.map List.rev;;
val group : char list -> char list list = <fun>
# group lst;;
- : char list list = [['1'; '2'; '3']; ['4'; '5']; ['6']]

Альтернативно:

    |> List.rev
    |> List.map List.rev;;

Мы можем использовать List.rev_map.

    |> List.rev_map List.rev;;

Разбивка звонка:

List.fold_left f [] ['1'; '2'; '3'; ' '; ' '; '4'; '5'; ' '; '6']
List.fold_left f [['1']] ['2'; '3'; ' '; ' '; '4'; '5'; ' '; '6']
List.fold_left f [['2'; '1']] ['3'; ' '; ' '; '4'; '5'; ' '; '6']
List.fold_left f [['3'; '2'; '1']] [' '; ' '; '4'; '5'; ' '; '6']
List.fold_left f [[]; ['3'; '2'; '1']] [' '; '4'; '5'; ' '; '6']
List.fold_left f [[]; []; ['3'; '2'; '1']] ['4'; '5'; ' '; '6']
List.fold_left f [['4']; []; ['3'; '2'; '1']] ['5'; ' '; '6']
List.fold_left f [['5'; '4']; []; ['3'; '2'; '1']] [' '; '6']
List.fold_left f [[]; ['5'; '4']; []; ['3'; '2'; '1']] ['6']
List.fold_left f [['6']; ['5'; '4']; []; ['3'; '2'; '1']] []
(List.filter @@  (<>) []) [['6']; ['5'; '4']; []; ['3'; '2'; '1']]
List.rev [['6']; ['5'; '4']; ['3'; '2'; '1']]
List.map List.rev [['3'; '2'; '1']; ['5'; '4']; ['6']]
[['1'; '2'; '3']; ['4'; '5']; ['6']]

Если вы хотите выразить это без использования List.fold_left, вы можете использовать явный аккумулятор. Сопоставление с образцом отображается таким же образом.

# let rec group ?(acc=[]) lst = 
    match acc, lst with
    | _,     []      -> List.(rev @@ map rev @@ filter ((<>) []) acc)
    | _,     ' '::xs -> group ~acc: ([] :: acc) xs
    | [],    x::xs   -> group ~acc: [[x]] xs
    | y::ys, x::xs   -> group ~acc: ((x :: y) :: ys) xs;;
val group : ?acc:char list list -> char list -> char list list = <fun>
# group lst;;
- : char list list = [['1'; '2'; '3']; ['4'; '5']; ['6']]

Другие вопросы по теме

Похожие вопросы

Идентификация 4-связных точечных рисунков в сетке 3D-точек с шумом
Чистый способ проверить, является ли переменная списком списков, используя сопоставление с образцом
Как использовать сопоставление шаблонов Elixir, чтобы проверить, начинается ли элемент списка с заданной строки (в переменной)?
Сопоставление шаблонов записей массива/разделения
Сопоставление нескольких шаблонов одновременно в ocaml
Почему 00 является допустимым целым числом в Python?
Как выполнить несколько других дел внутри дела
Использование sed для замены шаблона между фигурными скобками, где строка непосредственно перед открывающей фигурной скобкой содержит известное слово
Почему блоки кода совпадения/регистра не схлопываются в PyCharm?
Как выбрать строки между двумя одинаковыми шаблонами маркеров, которые могут встречаться несколько раз с помощью awk/perl или любого другого инструмента командной строки