2016-04-15 85 views
1

我有类似:[[x,y,z],[a,b,c],[x,b,c],[!x,a,o]](名单列表)从列表的列表中删除列表,以及更OCaml中

而且我要删除所有有我搜索的元素,例如列表,如果我搜索x我将不得不有类似的,[[a,b,c],[!x,a,o]]

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

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

我有一个模糊的想法那是后话用的List.filter

一个List.filter和/或List.mapLis.filter ------------------- EDIT-- -----------------------
正如我在评论中说的,我做了一个叫head的函数来返回它在这样的列表上看到的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 我需要澄清一些问题,使问题更容易?

回答

2

您需要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]] 

更新:取代List.existsList.mem由Anton Trunov的建议。

+0

我想它没有奏效我做了这样的事情:我定义了一个名为head的函数来返回它看到的1º元素让head = 函数 x :: _ - > x | _ - >“没有头”?然后我做了一个类似于你建议给我的功能的函数let funfilter elem ll = List.filter(fun inner - >(List.exists(fun x - > x <> elem)inner))ll ;;然后我做了一个这样的电话,就像这个过滤器(头(passalista))passalista ;; (passalista是列表的列表),它不会过滤任何东西,当我再次打印passalista时,它具有与以前相同的值。难道我做错了什么? –

+1

你可以使用'fun inner - > not(List.mem elem inner)'作为'List.filter'的lambda' –

+0

Joao Saraiva,请看看上面的例子,它与你想要做的事情相匹配吗?安东特鲁诺夫,好点!我更新了代码以使用'List.mem'。 –