query {
for i in [|1;2;3;4|] do
select i // ERROR: FS0001
where (i = 26)
}
query {
for i in [|1;2;3;4|] do
where (i = 26)
select i
} // OK
编译器在select i
上报告第一个查询的FS0001。根据https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/Query.fsi
member Select : source:QuerySource<'T,'Q> * [<ProjectionParameter>] projection:('T -> 'Result) -> QuerySource<'Result,'Q>
member Where : source:QuerySource<'T,'Q> * [<ProjectionParameter>] predicate:('T -> bool) -> QuerySource<'T,'Q>
Select
和Where
具有相同的第一个参数类型,并且具有相似的返回类型。为什么他们的顺序很重要?
经过研究后找到原因。
功能Where
具有MaintainsVariableSpace
属性,而Select
不具有。这就是i
子句后where
子句不可见select
的原因。