我有一个函数可以返回给定列表中的每个“子列表”:
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;;
但我认为这在这里毫无用处。库尔有人帮助我吗?
答案 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)
。它应该代表什么?