2012-11-26 484 views
4

我正在尋找一個函數,它需要兩個列表之間的交集並創建一個新列表,我有這個函數:let intersect x y = Set.intersect (Set.ofList x) (Set.ofList y)這是我做的,但我不想使用任何內置函數F#兩個列表之間的交集F#

+0

使用內置的東西究竟有什麼問題 - 它會比你自己寫的任何東西都好。此外,您所寫的任何內容都會複製它 –

+2

如果您忽略列表中的排序,則可以將其視爲多重集,而不是集。你想在列表中多次出現的元素做什麼? – Joh

回答

5

最好是使用圖書館的東西,但如果你不能

如果我們假設輸入列表進行排序(使用List.sort或寫你自己的):

let rec intersect a b = 
    match a with 
    |h::t -> match b with 
      |h2::t2 -> 
       if h=h2 then h::(intersect t t2) 
       else if h>h2 then intersect t b else intersect a t2 
      |[] -> [] 
    |[] -> [] 
+0

是否可以使用「平行」匹配進行改進,即一次匹配a和b? – Joh

+0

測試了這段代碼,它不起作用 – user1838768

+1

@ user1838768:你用排序列表測試過嗎? – pad

4

我同意將列表轉換爲集合不是在這種情況下很好。

這裏是另一種替代方案,無需轉換工程組,而是使用內置Enumerable.Intersect功能:

open System.Linq 

let intersect (xs:'a seq) (ys: 'a seq) = xs.Intersect(ys) 

你可以調用這個函數與FSharpList