使用其他列表过滤列表?

时间:2013-12-11 00:32:34

标签: f#

我有两个

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

我需要过滤list1 Id 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) ))

为什么呢?它们只是两种不同的方式来编写具有相同功能的代码吗?

1 个答案:

答案 0 :(得分:5)

F#类型推断严格从左到右。因此,在这部分

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

l2的类型未知。结果你得到一个(有点奇怪的)错误信息。

在第二种情况下,你有list2 |> ...,这意味着当你进行比较时,l2的类型是已知的,所以一切都很好。