在F#中给出了
元组具有自动定义的相等操作
因此
let myQueryable = [| (1, 1); (2,2)|].AsQueryable()
let check =
query {
for x in myQueryable do
} |> Seq.where(fun x -> x = (2,2))
是{(2,2)}
,那么为什么
let check =
query {
for x in myQueryable do
where(x = (2, 2))
}
是Empty
?
答案 0 :(得分:1)
这似乎是C#System.Tuple
和F#参考元组之间的兼容性问题。
有趣的是,兼容性问题似乎在C#7和F#4.1之间解决,新的ValueTuple
等同于F#struct元组。
let myQueryableNew = [| ValueTuple.Create(1, 1); ValueTuple.Create(2,2) |].AsQueryable()
let resultFSharp1 =
query {
for x in myQueryableNew do
} |> Seq.where(fun x -> x = ValueTuple.Create(2,2))
let resultFSharp2 =
query {
for x in myQueryableNew do
where (x.Equals(ValueTuple.Create(2, 2)))
}
顺便说一下,还要注意新类型的默认值更为一致(如果这是相关的issue)
let testDefault =
query {
for x in myQueriable1 do
where (x.Equals(ValueTuple.Create(1, 2)))
select x
headOrDefault
}
答案 1 :(得分:0)
您可能已System.Linq
打开。
以下两种情况下,我都会返回(2,2)
:
//open System
//open System.Linq
let myQueryable = [| (1, 1); (2,2) |] //.AsQueryable()
let check =
query {
for x in myQueryable do
select x
} |> Seq.where(fun x -> x = (2,2))
check //val it : seq<int * int> = seq [(2, 2)]
let check' =
query {
for x in myQueryable do
where (x = (2, 2))
select x
}
check' //val it : seq<int * int> = seq [(2, 2)]
所以在IQueryable
范围内,这种结构性平等并不成立。我不知道它是否因为IQueryable类型,即它成为引用相等,或者where
被重新定义,或者是一个可能的错误。