Как разделить список символов (который представляет слово) на все возможные триплеты (префикс, single_letter, суффикс) в CAML? - PullRequest
1 голос
/ 11 апреля 2019

Я определил тип «слово» как список символов.Я пытаюсь написать рекурсивную функцию "div_word", которая принимает одно "слово" в качестве аргумента и возвращает список триплетов всех возможных (префикс, single_letter, суффикс) комбинаций "слова".

Пример выполнения в OCAML:

assert( divide_word ['c';'o';'d';'e'] = [  ([],'c',['o';'d';'e']) ; (['c'],'o',['d';'e']) ; (['c','o'],'d',['e']) ; (['c','o','d'],'e',[])  ];;

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

Это код, который я написал:

type word = char list;;

let rec divide_word (w:word) : (word*char*word) list =
  match w with
  |[] -> []
  |h::[] -> [([],h,[])]
  |h::t -> List.map (fun (fir,sec,th) -> (h::fir,sec,th)) (divide_word t);;

помогите!с:

1 Ответ

2 голосов
/ 11 апреля 2019

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

Как только это будет сделано, вы, вероятно, заметите, что случай h::[] на самом деле является частным случаем h::t, поэтому нет необходимости рассматривать его отдельно в своем собственном шаблоне.

...