2012-06-24 12 views
7

w F # można łatwo zrobićF # wygenerowanie sekwencji/tablicę dat

let a = [1 .. 10];; 

Więc dlaczego nie mogę zrobić

let a = DateTime.Parse("01/01/2012") 
let b = DateTime.Parse("01/01/2020") 


let dateList = [a .. b] 

To daje błąd Type constraint mismatch. The type DateTime is not compatible with type TimeSpan

Odpowiedz

14

Istnieją dwa problemy - po pierwsze musisz określić interwał, którego chcesz użyć między elementami listy. Byłby to TimeSpan, ale nie ma statycznego elementu Zero.

To ograniczenie jest wymagane przez skip range operator co wymaga kroku "typ mieć statyczne (+) i Zero członków

Można zdefiniować własną strukturę, która obsługuje wymaganych operacji Jednakże:

type TimeSpanW = { span : TimeSpan } with 
    static member (+) (d:DateTime, wrapper) = d + wrapper.span 
    static member Zero = { span = new TimeSpan(0L) } 

ty może następnie:

let ts = new TimeSpan(...) 
let dateList = [a .. {span = ts} .. b] 

Edytuj: Oto alternatywa składnia dyskryminowane za pomocą związków, które mogą wolisz:

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] 
+0

Działa pięknie ... Czy istnieje link wyjaśniający, co się dzieje? Dlaczego wymagane jest zero? Także ten (+) operator. –

+0

@KnowsNotMuch - Jest to wymagane przez operatora "zakresu pominięcia" - zaktualizowałem odpowiedź za pomocą linku. – Lee

+1

@KnowsNotMuch - co się właściwie dzieje - krok musi zaczynać się od 0, a następnie zwiększać - jeśli spojrzysz na sygnaturę, krok nie musi mieć tego samego typu co punkty końcowe. –

11

Oto modny sposób generowania listy terminach. Zauważ, że nie biorę na to żadnego uznania, ponieważ otrzymałem je od kogoś innego.

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;; 

Zwraca:

Val że: lista DateTime = [12.01.2013 0:00:00; 02.12.2013 00:00:00; 03/12/2013 00:00:00; 04/12/2013 00:00:00]