OCaml:从列表中删除连续的重复项而不递归

时间:2015-10-14 04:17:01

标签: list recursion module duplicates ocaml

我应该在不使用递归的情况下从int list删除连续重复项,并且仅使用List.foldmapfilterfold_leftfold_right

我几乎得到了它,但我的代码的问题是它检查每个元素是否等于第二个元素,而不是下一个元素。

例如,如果let z = int list [3;1;4;5;5;1;1]我的代码将返回[3;4;5]而不是[3;1;4;5;1]。我不确定如何更改它,因此filter使用动态更改列表参数而不仅仅是原始参数(因此它不会将每个元素与第二个元素进行比较(在本例中为1)每一次):

let dupe (ls: int list) : int list =
    List.filter (fun x -> if List.length ls = 0 then true else if x = List.hd (List.tl xs) then false else true) ls

2 个答案:

答案 0 :(得分:0)

List.filter的类型是:

# List.filter;;
- : ('a -> bool) -> 'a list -> 'a list = <fun>

值得注意的是,过滤器功能一次只能看到列表中的一个元素。你需要看两个连续的元素来决定做什么,所以我说List.filter不能胜任这个工作。

我要说,你必须使用map或其中一个折叠。你可以用类似的推理找出哪一个会起作用。

(我认为这是作业应该说明的那种推理。所以我要把它留在那里。)

答案 1 :(得分:0)

没有rec

 let remove = function
        []    -> []
      | x::tl -> 
         let (_,lxRes)=
           List.fold_left (
            fun (xPrec,lxRes) xCour ->
             if xPrec=xCour then
               (xCour,lxRes)
             else
               (xCour,lxRes@[xCour])
           ) (x+1,[]) (x::tl)
          in
          lxRes

测试:

# remove  [3;1;4;5;5;1;1];;
- : int list = [3; 1; 4; 5; 1]
# remove [1;1];;
- : int list = [1]
# remove [1;1;1;1;2;2;3;4;5;5];;
- : int list = [1; 2; 3; 4; 5]

使用rec(仅供参考)

let rec remove =
function
  | []       -> []
  | x::[]    -> x::[]
  | x::y::tl ->
     if x=y then remove (y::tl)
     else x::remove (y::tl)
相关问题