Как заставить функцию tail вернуть то, что мне нужно? - PullRequest
0 голосов
/ 13 ноября 2018

Мне нужно закодировать список в OCaml. Команда: encode ['a', 'a', 'b', 'b', 'b', 'c'] ;; должен вернуть [(2, 'a'); (3, 'b'); (1, 'c')]

Теперь у меня есть эта функция:

let encode list =
let rec encodeHelper list acc = match list with
    | [] -> []
    | head :: [] -> (1, head) :: []
    | head :: headNext :: tail -> if (head = headNext) then encodeHelper (headNext :: tail) (acc + 1)
                                    else (acc, head) :: encodeHelper (headNext :: tail) acc
in encodeHelper list 1
;;

Но возвращается:

  • : (int * (char * char * char * char * char * char)) list = [(1, ('a', 'a', 'b', 'b', 'b', 'c'))]

1 Ответ

0 голосов
/ 13 ноября 2018

Ваши тестовые данные, как показано вверху, не в правильной форме.

Список в OCaml содержит элементы, разделенные точками с запятой (;).Вместо этого ваши тестовые данные используют запятые (,).Запятые используются для кортежей, поэтому вы видите кортеж в своем результате.

Если вы измените , на ; в ваших тестовых данных, вы должны увидеть что-то ближе к тому, что вы ищетеза.Осталось решить хотя бы одну проблему (в моем тестировании).

...