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

jpi*_*son 3 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

kvb*_*kvb 7

如果您执行以下操作,您会看到相同的结果:

let f x = 1

f o.Description.Contains("spam")
Run Code Online (Sandbox Code Playgroud)

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