我应该在不使用递归的情况下从int list
删除连续重复项,并且仅使用List.fold
,map
,filter
,fold_left
, fold_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
答案 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)