F# 在嵌套for循环中使用匹配表达式

F# 在嵌套for循环中使用匹配表达式,f#,f#-3.0,F#,F# 3.0,在最内层for循环的查询中,我似乎失去了智能感知,这让我相信我写的是糟糕的代码。这似乎是match语句的一个问题。当我试图通过简单地捕捉价值来匹配时,一切似乎都起作用了。当我试图通过比较值进行匹配时,代码似乎中断了。代码如下: let createOrderFromStdOrder () = // retrieve standard orders let stdOrders = Queries.retrieveStdOrders null |> Seq.

在最内层for循环的查询中,我似乎失去了智能感知,这让我相信我写的是糟糕的代码。这似乎是match语句的一个问题。当我试图通过简单地捕捉价值来匹配时,一切似乎都起作用了。当我试图通过比较值进行匹配时,代码似乎中断了。代码如下:

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 = // ...