F# では簡単にできます
let a = [1 .. 10];;
じゃあどうしてできないの
let a = DateTime.Parse("01/01/2012")
let b = DateTime.Parse("01/01/2020")
let dateList = [a .. b]
エラーが発生しますType constraint mismatch. The type DateTime is not compatible with type TimeSpan
F# では簡単にできます
let a = [1 .. 10];;
じゃあどうしてできないの
let a = DateTime.Parse("01/01/2012")
let b = DateTime.Parse("01/01/2020")
let dateList = [a .. b]
エラーが発生しますType constraint mismatch. The type DateTime is not compatible with type TimeSpan
2 つの問題があります。まず、リストの要素間で使用する間隔を指定する必要があります。これは になりますが、静的メンバーTimeSpan
はありません。Zero
この制約は、「ステップ」タイプに静的メンバーとメンバーを持つことを要求する範囲スキップ演算子によって必要とされます(+)
Zero
ただし、必要な操作をサポートする独自の構造を定義できます。
type TimeSpanW = { span : TimeSpan } with
static member (+) (d:DateTime, wrapper) = d + wrapper.span
static member Zero = { span = new TimeSpan(0L) }
その後、次のことができます。
let ts = new TimeSpan(...)
let dateList = [a .. {span = ts} .. b]
編集:判別共用体を使用した別の構文を次に示します。
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]
これは、日付のリストを生成するファンキーな方法です。他の誰かから入手したので、これについてはまったく信用していないことに注意してください。
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;;
戻り値:
val it : DateTime list = [01/12/2013 00:00:00; 2013 年 2 月 12 日 00:00:00; 2013/03/12 00:00:00; 2013/04/12 00:00:00]