Стандартный тип System.DateTime
является структурой (а не записью F #), что делает его несколько непригодным для неизменного программирования на F # - это можно решить с помощью помощников, подобных тем, которые вы предлагали.
Другойподход заключается в определении записи F # с отображением в System.DateTime
:
type ImmutableDateTime =
{ Day : int
Month : int
Year : int
Hour : int
Minute : int
Second : int }
member x.DateTime =
System.DateTime(x.Year, x.Month, x.Day, x.Hour, x.Minute, x.Second)
static member FromDateTime(dt:System.DateTime) =
{ Day = dt.Day; Month = dt.Month; Year = dt.Year
Hour = dt.Hour; Minute = dt.Minute; Second = dt.Second }
Теперь вы можете взять System.DateTime
, превратить его в ImmutableDateTime
, выполнить хорошее функциональное программирование с записью и затемпреобразовать его обратно:
let dt1 = ImmutableDateTime.FromDateTime(System.DateTime.Now)
let dt2 = { dt1 with Year = 2018 }
dt2.DateTime.ToShortDateString()
Тем не менее, на практике, я бы, вероятно, просто принял бы тот факт, что System.DateTime
является структурой, и использовал бы его таким образом.