Ocaml: получить список символов, которые находятся между двумя персонажами - PullRequest
0 голосов
/ 20 февраля 2019

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

Пример.«b» просто выдаст список ['b'], «az» даст ['a';«б»;'c';...;'z'] и что-то вроде "ad-g2-6" будет ['a';'d';«е»;'f';'г' ;«2»;«3»;«4»;«5»;'6'], так как есть символ a и диапазоны dg и 2-6.(Также стоит отметить, что что-то вроде «a-» будет просто ['a'; '-'], так как диапазон не был завершен.

Мои идеи для решения этой проблемы сводятся к взрыву строки всписок символов (lst), затем сопоставление с образцом и построение на аккумуляторе, например

let mainfunc str = let lst = (explode str) in
  let rec func lst acc = match lst with 
    | [] -> acc 
    | a::'-'::b::t -> func t (acc @ **SOMETHING TO GET THIS RANGE**)
    | a::t -> func t (acc @ [a])
  in func lst []

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

(Также обратите внимание, что моя функция разнесения работает как задумано и преобразует строку в список символов)

1 Ответ

0 голосов
/ 20 февраля 2019

Поскольку вы написали успешную функцию explode, я предполагаю, что у вас нет проблем с рекурсией и т. Д. Таким образом, проблема может заключаться просто в способе говорить о символах как значениях (чтобы вы могли получить следующий символ после заданногоone).

Для этого вы можете использовать Char.code и Char.chr (из стандартной библиотеки OCaml).

Вот функция, которая принимает символ и возвращает список, состоящий из символаи следующий по порядку:

let char_pair c =
    [ c; Char.chr (Char.code c + 1) ]

Вот как это выглядит при запуске:

# char_pair 'x';;
- : char list = ['x'; 'y']

(Я оставляю в качестве упражнения проблему работы с персонажем с кодом 255.)

В качестве дополнительного комментария, ваш подход выглядит довольно хорошо для меня.Похоже, это будет работать.

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