为什么在F#中使用方法链接查询表达式where子句需要括号?

时间:2017-02-10 17:01:26

标签: linq f#

尝试通过LinqPad在F#中编写更多查询我遇到了一个有趣的事情,使用了where子句。

let dc = new TypedDataContext()

let q = query {
    for o in dc.OrderItem do 
    where (o.Description.Contains("spam"))
    select o
}

q |> Dump

如果我删除o.Description.Contains("spam")周围的括号,我会看到下面经常看到的错误消息。

  

连续参数应该用空格或元组分隔,涉及函数或方法应用程序的参数应该用括号括起来(使用外部F#编译器)

当我看到这个错误时,我通常意识到我没有提供足够的信息,以便编译器理解我试图链接先前方法调用或属性获取访问器的结果调用,但在这种情况下,我不清楚。另外,如果有更多惯用的方法来满足编译器的条件而不必在表达式周围添加开括号和右括号,我会很好奇。

1 个答案:

答案 0 :(得分:7)

如果你做了类似的事情,你会看到相同的结果:

let f x = 1

f o.Description.Contains("spam")

如消息所暗示的,如果您使用方法调用的结果(在这种情况下为Contains)作为函数的参数,则方法调用需要括起来。即使where是查询运算符而不是真正的函数,也会应用相同的结果。