结合OCaml中的两个功能

时间:2016-11-04 16:55:02

标签: ocaml

我的任务是从列表中删除重复项。要做到这一点,我必须先对列表进行排序。

我编写了对列表进行排序的函数以及删除列表的函数 重复(一旦它们被分类)但我不知道如何组合它们。

示例:

输入:[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) ;;

1 个答案:

答案 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

除非实际从中获得某些内容,否则请勿使用此样式。大多数 它只会使程序的可读性和速度降低而没有相应的好处。 *)