如何压缩列表

Sul*_*man 1 ocaml

我有一个列表:["a"; "a"; "a"; "c"; "b"; "c"; "c"; "a"; "a"; "d"; "x"; "e"; "e"; "e"]我想压缩它。换句话说,删除每个索引左侧和右侧的重复项。

该函数compress l应该返回["a"; "c"; "b"; "c"; "a"; "d"; "x"; "e"]

我已经在 OCaml 中尝试过这个功能:

let compress list = 
  List.filteri 
    (fun i el -> compare (List.nth list i) el != 0) 
    list;;
Run Code Online (Sandbox Code Playgroud)

它向我抛出错误异常:失败“nth”。

gle*_*nsl 5

由于我们已经处于这个问题的“为什么做你自己的家庭作业,当人们在这样的情况下会很乐意为你做这件事”阶段,我认为手写的递归函数比折叠更简单、更容易理解:

let rec compress = function
  | a :: b :: rest when a = b -> compress (a :: rest)
  | a :: rest -> a :: (compress rest)
  | [] -> []
Run Code Online (Sandbox Code Playgroud)

它不是尾递归,但很容易修复并留给读者作为练习。为了理解算法,它只会分散注意力。