使用其他列表过滤列表?

ca9*_*3d9 1 f#

我有两个清单

type Item1 = { Id: int; .... }
type Item2 = { Id: int; .... }
let list1: Item1 list = ....
let list2: Item2 list = ....
Run Code Online (Sandbox Code Playgroud)

我需要过滤list1Id存在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)

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

Joh*_*mer 5

F#类型推断严格从左到右.结果,在这一部分

 list1 |> Seq.filter (fun l1 -> (List.exists (fun l2 -> l1.Id = l2.Id) list2))
Run Code Online (Sandbox Code Playgroud)

这种类型l2是未知的.结果你得到一个(有点奇怪)错误消息.

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