Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
日期范围的F#生成器?_F#_Generator - Fatal编程技术网

日期范围的F#生成器?

日期范围的F#生成器?,f#,generator,F#,Generator,我正在尝试编写一个函数,该函数使用生成器语法生成日期时间列表: let dateRange = let endDate = System.DateTime.Parse("6/1/2010") let startDate = System.DateTime.Parse("3/1/2010") seq { for date in startDate..endDate do if MyDateClass.IsBusiness

我正在尝试编写一个函数,该函数使用生成器语法生成日期时间列表:

let dateRange = 

    let endDate = System.DateTime.Parse("6/1/2010")
    let startDate = System.DateTime.Parse("3/1/2010")

    seq {
          for date in startDate..endDate do
              if MyDateClass.IsBusinessDay(date) then yield date
        }
但是生成器('seq')块没有正确解析。它需要一个时间跨度。虽然生成器语法似乎非常适合我想做的事情,但它对于除两个数字以外的任何东西都是不直观的

  • 是否可以使用生成器语法创建日期时间范围?
  • 有没有比我写的更好的方法来考虑如何创建范围(即'in'子句)

  • NET中两个DateTime对象之间的算术差异始终是一个时间跨度,这是您的第一个问题。如果您有一个TimeSpan,它将不会实现IEnumerable,因此不能用作序列。但是,您可以编写自己的序列表达式:

    let rec dates (fromDate:System.DateTime) (toDate:System.DateTime) = seq {
                if fromDate <= toDate then 
                    yield fromDate
                    yield! dates (fromDate.AddDays(1.0)) toDate
                }
    

    如果
    TimeSpan
    具有静态
    Zero
    属性,则可以执行类似
    startDate.的操作。。时间跨度(1,0,0,0)。。结束日期
    。即使没有,您也可以创建一个包装器来完成相同的任务:

    open System
    
    type TimeSpanWrapper = { timeSpan : TimeSpan } with
      static member (+)(d:DateTime, tw) = d + tw.timeSpan
      static member Zero = { timeSpan = TimeSpan(0L) }
    
    let dateRange =
        let endDate = System.DateTime.Parse("6/1/2010")
        let startDate = System.DateTime.Parse("5/1/2010")
        let oneDay = { timeSpan = System.TimeSpan(1,0,0,0) }
    
        seq {
              for date in startDate .. oneDay .. endDate do
                 if MyDateClass.IsBusinessDay(date) then yield date
            }
    

    你日期的格式使我无法阅读这个问题的其余部分。说真的,我的眼睛在流泪。我不太明白。日期格式有什么问题?
    open System
    
    type TimeSpanWrapper = { timeSpan : TimeSpan } with
      static member (+)(d:DateTime, tw) = d + tw.timeSpan
      static member Zero = { timeSpan = TimeSpan(0L) }
    
    let dateRange =
        let endDate = System.DateTime.Parse("6/1/2010")
        let startDate = System.DateTime.Parse("5/1/2010")
        let oneDay = { timeSpan = System.TimeSpan(1,0,0,0) }
    
        seq {
              for date in startDate .. oneDay .. endDate do
                 if MyDateClass.IsBusinessDay(date) then yield date
            }