2016-04-15 84 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'。 –