查找符合Ocaml

时间:2016-11-25 12:41:10

标签: list ocaml

我有一个函数可以返回给定列表中的每个“子列表”:

let rec sublists = function
    [] -> [[]]
    | h::t -> let st = sublists t in
        List.map (function l -> h::l) st @ st;;

例如,如果您尝试

子列表[1; 4; 9; 12]

它将返回:

[[1; 4; 9; 12]; [1; 4; 9]; [1; 4; 12]; [1; 4]; [1; 9; 12]; [1; 9]; [1; 12];  [1]; [4; 9; 12]; [4; 9]; [4; 12]; [4]; [9; 12]; [9]; [12]; []]

这是列表中元素的每种可能组合(顺序无关紧要)

我必须做一个函数,它返回一个满足给定属性的不同子列表对。

功能必须具有以下类型:('列表 - >'列表 - > bool) - > '列表 - > '列表*'列表

例如,如果我们有上一个列表,我们会尝试

搜索(< 4)[1; 4; 9; 12]

它将返回:

([9; 12],[9])因为这些列表满足给定条件(< 4)。顺序无关紧要,它可以返回([9],[12]),或其他可能的组合。

我对此感到困惑,我做了一个函数,检查给定列表是否是另一个列表的子列表:

let is_sublist_of l1 l2 =
    let sub = sublists l1 in 
        List.mem l2 sub;;

但我认为这在这里毫无用处。库尔有人帮助我吗?

1 个答案:

答案 0 :(得分:2)

您不能先过滤列表然后再将第一批子列表应用到它吗?

let filter_sublist f l = 
  let l = List.filter f l in
  let rec sublists = function
    | [] -> [], []
    | h :: t -> 
      let st1, st2 = sublists t in
      h :: st1, st2
  in sublists l

此处的问题是f属于'a -> bool类型,因为我不了解您的类型('a list -> 'a list -> bool)。它应该代表什么?