FSharp:为什么不能在查询表达式中的`where`之前放置`select`子句?

问题描述 投票:0回答:1
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>

SelectWhere具有相同的第一个参数类型,并且具有相似的返回类型。为什么他们的顺序很重要?

.net linq f#
1个回答
0
投票

经过研究后找到原因。

功能Where具有MaintainsVariableSpace属性,而Select不具有。这就是i子句后where子句不可见select的原因。

© www.soinside.com 2019 - 2024. All rights reserved.