在F#我很容易做到
let a = [1 .. 10];;
Run Code Online (Sandbox Code Playgroud)
那为什么我不能这样做
let a = DateTime.Parse("01/01/2012")
let b = DateTime.Parse("01/01/2020")
let dateList = [a .. b]
Run Code Online (Sandbox Code Playgroud)
它给出了一个错误 Type constraint mismatch. The type DateTime is not compatible with type TimeSpan
Lee*_*Lee 15
有两个问题 - 首先,您需要指定要在列表元素之间使用的间隔.这将是一个TimeSpan,但它没有静态Zero成员.
跳过范围运算符需要此约束,该运算符要求"步"类型具有静态(+)和Zero成员
您可以定义自己的结构,但该结构支持所需的操作:
type TimeSpanW = { span : TimeSpan } with
static member (+) (d:DateTime, wrapper) = d + wrapper.span
static member Zero = { span = new TimeSpan(0L) }
Run Code Online (Sandbox Code Playgroud)
然后你可以这样做:
let ts = new TimeSpan(...)
let dateList = [a .. {span = ts} .. b]
Run Code Online (Sandbox Code Playgroud)
编辑:这是使用您可能更喜欢的歧视联盟的替代语法:
type Span = Span of TimeSpan with
static member (+) (d:DateTime, Span wrapper) = d + wrapper
static member Zero = Span(new TimeSpan(0L))
let ts = TimeSpan.FromDays(1.0)
let dateList = [a .. Span(ts) .. b]
Run Code Online (Sandbox Code Playgroud)
jam*_*iet 11
这是生成日期列表的一种时髦方式.请注意,由于我是从其他人那里得到的,所以我对此毫不在意.
open System
let a = new DateTime(2013,12,1)
let b = new DateTime(2013,12,5)
Seq.unfold (fun d -> if d < b then Some(d, d.AddDays(1.0)) else None) a
|> Seq.toList;;
Run Code Online (Sandbox Code Playgroud)
它返回:
val it:DateTime list = [01/12/2013 00:00:00; 02/12/2013 00:00:00; 03/12/2013 00:00:00; 04/12/2013 00:00:00]
| 归档时间: |
|
| 查看次数: |
2031 次 |
| 最近记录: |