我有两个
列表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) ))
为什么呢?它们只是两种不同的方式来编写具有相同功能的代码吗?
答案 0 :(得分:5)
F#类型推断严格从左到右。因此,在这部分
list1 |> Seq.filter (fun l1 -> (List.exists (fun l2 -> l1.Id = l2.Id) list2))
l2
的类型未知。结果你得到一个(有点奇怪的)错误信息。
在第二种情况下,你有list2 |> ...
,这意味着当你进行比较时,l2
的类型是已知的,所以一切都很好。