Сглаживание списка списков в OCaml - PullRequest
0 голосов
/ 27 марта 2012

Я реализую эту функциональность с помощью Ocaml:

  • Не разрешено использовать List модуль
  • функция имеет тип 'a list list -> 'a list
  • функция возвращает список, состоящий из списков в x, соединенных вместе (только верхний уровень списков объединяется, в отличие от List.flatten)
  • Например: [[1,2,3],[45]] => [1,2,3,4,5] и [[[1,2,3],[4,5]],[[6,7]]] => [[1,2,3],[4,5],[6,7]]

Я не уверен, с чего начать, кто-нибудь может дать мне какое-нибудь предложение? Спасибо

Ответы [ 2 ]

6 голосов
/ 27 марта 2012

Я не вижу разницы между List.flatten и вашей функцией.

Чтобы ответить на ваш вопрос: как обычно со списками, попробуйте подумать о базовых случаях:

  • что вы делаете, когда объединяете пустой список с чем-то?
  • что вы делаете, когда объединяете непустой список (с головой и хвостом) с чем-то?

Оберните все в шаблонное совпадение, приготовьте его несколько часов, и все готово: -)

2 голосов
/ 27 марта 2012

Томас дал отличный совет. Ваша основная операция - добавить один список в другой. Это может помочь сначала написать эту функцию как отдельную функцию. Это будет выглядеть примерно так:

let rec myappend a b =
    match a with
    | [] -> (* Empty list prefixed to b (easy case) *)
    | ahead :: atail -> (* Recursive case *)

Имея собственную функцию добавления, вы можете выполнить другой уровень рекурсии добавить все списки верхнего уровня, как предлагает Томас.

...