从列表的列表中删除列表,以及 Ocaml 中的更多内容

Removing a lists from a list of list, and more in Ocaml

我有类似的东西:[[x,y,z],[a,b,c],[x,b,c],[!x,a,o]](列表列表)

我想删除所有包含我搜索的元素的列表,例如,如果我搜索 x,我将不得不有类似 [[a,b,c],[!x,a,o]].[=25= 的内容]

我知道,如果它是一个简单的列表,我将不得不这样做: let funfilter elem l = List.filter (fun x -> x != elem) l;; 对于列表的列表,我需要在过滤器或 map filter 中做一个过滤器。但我找不到正确的语法,而且我不确定这是否是删除列表所需要做的唯一事情。

其他平行问题,如果我只想删除列表列表中的元素,在这种情况下元素 !x -> 结果 [[a,b,c],[a,o]],我应该怎么做?

我有个模糊的想法是 Lis.filter of a List.filter and/or List.map of a List.filter

--------------------编辑------------------------
正如我在评论中所说,我做了一个名为 head 的函数 return 它在这样的列表中看到的 1º 元素

let head = 
function 
x::_ -> x
| _ -> failwith "no head?";;

和这个函数:

let funfilter elem ll = 
List.filter (fun inner -> (List.exists (fun x -> x <> elem) inner)) ll;;

(我的列表名为passalista) 然后我就做了 funfilter (head(head passalista)) passalista 在它旁边我打印了我的 passalista 并且值都是相同的。

我现在做错了什么? :s 我需要澄清一些事情以使问题更容易吗?

你需要List.mem:

let funfilter elem xs = 
  List.filter (fun inner -> not (List.mem elem inner)) xs

其中 elem 是要用于过滤的元素,xs 是列表的列表。

示例:

# let funfilter elem xs = 
    List.filter (fun inner -> not (List.mem elem inner)) xs;;
val funfilter : 'a -> 'a list list -> 'a list list = <fun>
# let passalista = [[1; 2]; [3; 2; 1]; [4]];;
val passalista : int list list = [[1; 2]; [3; 2; 1]; [4]]
# funfilter (List.hd (List.hd passalista)) passalista;;
- : int list list = [[4]]

更新:根据 Anton Trunov 的建议将 List.exists 替换为 List.mem