我有两个清单
type Item1 = { Id: int; .... }
type Item2 = { Id: int; .... }
let list1: Item1 list = ....
let list2: Item2 list = ....
Run Code Online (Sandbox Code Playgroud)
我需要过滤list1
其Id
存在list2
.以下代码不起作用.
list1 |> Seq.filter (fun l1 -> (List.exists (fun l2 -> l1.Id = l2.Id) list2))
Run Code Online (Sandbox Code Playgroud)
它期望list2具有类型Item1 list
.但是,以下代码有效.
list1 |> Seq.filter (fun l1 -> (list2 |> List.exists (fun l2 -> l1.Id = l2.Id) ))
Run Code Online (Sandbox Code Playgroud)
为什么?它们只是两种不同的方式来编写具有相同功能的代码吗?
F#类型推断严格从左到右.结果,在这一部分
list1 |> Seq.filter (fun l1 -> (List.exists (fun l2 -> l1.Id = l2.Id) list2))
Run Code Online (Sandbox Code Playgroud)
这种类型l2
是未知的.结果你得到一个(有点奇怪)错误消息.
在第二种情况下,你有list2 |> ...
这意味着l2
当你进行比较时已知类型,所以一切都很好.