F# 在嵌套for循环中使用匹配表达式
在最内层for循环的查询中,我似乎失去了智能感知,这让我相信我写的是糟糕的代码。这似乎是match语句的一个问题。当我试图通过简单地捕捉价值来匹配时,一切似乎都起作用了。当我试图通过比较值进行匹配时,代码似乎中断了。代码如下:F# 在嵌套for循环中使用匹配表达式,f#,f#-3.0,F#,F# 3.0,在最内层for循环的查询中,我似乎失去了智能感知,这让我相信我写的是糟糕的代码。这似乎是match语句的一个问题。当我试图通过简单地捕捉价值来匹配时,一切似乎都起作用了。当我试图通过比较值进行匹配时,代码似乎中断了。代码如下: let createOrderFromStdOrder () = // retrieve standard orders let stdOrders = Queries.retrieveStdOrders null |> Seq.
let createOrderFromStdOrder () =
// retrieve standard orders
let stdOrders =
Queries.retrieveStdOrders null |> Seq.toList
// retrieve orders
let orders = Queries.retrieveOrders null |> Seq.toList
// current date
let curDate = DateTime.Now
// iterate and create order
for i in stdOrders do
let validDates = MyUtil.stdDeadlineCheck i
// process standard order
let orderDate =
if not validDates.IsEmpty then
let daysOfWeek =
query{
for row in validDates do
sortBy row
take 2
}
for j in daysOfWeek do
match j with
| c -> // this seems to work
let order =
query{
for o in orders do
where(o.Works = i.Works) // and I get dot intellisense o and i
}
但如果我尝试这样匹配,它似乎会中断:
for j in daysOfWeek do
match j with
| DateTime.Now.DayOfWeek -> // this does not work
let order =
query{
for o in orders do
where(o.NOTHING = i.Works) // NO dot intellisense on o
}
我怀疑这可能与筑巢有关。如何更正此问题?模式匹配只能测试常量的相等性,而不能测试
DateTime.Now.DayOfWeek等值。原因是当值是一个简单变量名时,它会使其变得不明确,因为模式中的变量用于将此位置的任何值绑定到名称,而不是将其与现有变量进行比较:
match j with
| x ->
// in here, x is equal to j.
在您的特定情况下,如果
,您可以使用:
for j in daysOfWeek do
if j = DateTime.Now.DayOfWeek then
let order = // ...
但如果在更复杂的情况下,您希望与内部模式进行比较,则可以使用:
match someRecord with
| { someField = d } when d = DateTime.Now.DayOfWeek ->
let order = // ...