我的任务是从列表中删除重复项。要做到这一点,我必须先对列表进行排序。
我编写了对列表进行排序的函数以及删除列表的函数 重复(一旦它们被分类)但我不知道如何组合它们。
示例:
输入:[4;5;2;2;1;3;3]
输出:[1;2;3;4;5]
let rec setify = function
| [] -> []
| x :: l -> insert x (setify l)
and insert elem = function
| [] -> [elem]
| x :: l -> if elem < x then elem :: x :: l
else x :: insert elem l;;
let rec rem =function
|[] -> []
| x :: []-> x :: []
| x :: y :: rest -> if x = y then rem (y :: rest)
else x :: rem (y :: rest) ;;
答案 0 :(得分:1)
您希望创建一个列表,创建排序列表并对其进行重复数据删除的功能。换句话说,你想要:
let task list =
let sorted_list = setify list in
rem sorted_list
可以以任意更复杂的方式执行此操作,但以上是一个简单的单行操作版本。由于你的问题标题的措辞邀请它,这是一个更复杂的方式:
(* it's possible to write a generic combinator of functions, that takes two functions f and g *)
let combine f g =
(* and returns a function *)
fun x ->
(* that maps x to f(g(x)) *)
f (g x)
(* this function is typed as:
val combine : ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b = <fun>
*)
(* the task can then be expressed as the combination of setify and rem: *)
let task = combine rem setify
除非实际从中获得某些内容,否则请勿使用此样式。大多数 它只会使程序的可读性和速度降低而没有相应的好处。 *)