2013-12-11 59 views
1

我有使用另一個列表過濾列表?

type Item1 = { Id: int; .... } 
type Item2 = { Id: int; .... } 
let list1: Item1 list = .... 
let list2: Item2 list = .... 

我需要過濾list1Id存在list2兩個列表。以下代碼不起作用。

list1 |> Seq.filter (fun l1 -> (List.exists (fun l2 -> l1.Id = l2.Id) list2)) 

它期望list2的類型爲Item1 list。但是,下面的代碼工作。

list1 |> Seq.filter (fun l1 -> (list2 |> List.exists (fun l2 -> l1.Id = l2.Id))) 

爲什麼?他們不只是兩種不同的方式來編寫具有相同功能的代碼嗎?

+0

有趣的是,這兩個實際上在F#3.0上編譯得很好,但我不希望它們編譯。 –

回答

5

F#類型推斷嚴格從左到右。其結果是,在該部分

list1 |> Seq.filter (fun l1 -> (List.exists (fun l2 -> l1.Id = l2.Id) list2)) 

l2類型是未知的。結果你會得到一個(稍微奇怪的)錯誤信息。

在第二種情況下,您有list2 |> ...,這意味着在進行比較時已知l2的類型,所以一切正常。

+0

如果'list2'的類型是已知的,但應該工作。只有當函數的參數沒有任何類型的註釋,並且該函數在文件的其餘部分的任何地方仍然沒有被使用時,這將不能檢查 –

相關問題