在F#中不可以像C++一样进行函数重载,但是通过Discriminated Union,可以实现函数重载的效果。
http://blog.ploeh.dk/2013/10/21/replace-overloading-with-discriminated-unions/
type Period = | Year of int | Month of int * int | Day of int * int * int module Dates = let InitInfinite (date : DateTime) = date |> Seq.unfold (fun d -> Some(d, d.AddDays 1.0)) let In period = let generate dt predicate = dt |> InitInfinite |> Seq.takeWhile predicate match period with | Year(y) -> generate (DateTime(y, 1, 1)) (fun d -> d.Year = y) | Month(y, m) -> generate (DateTime(y, m, 1)) (fun d -> d.Month = m) | Day(y, m, d) -> DateTime(y, m, d) |> Seq.singleton let BoundariesIn period = let getBoundaries firstTick (forward : DateTime -> DateTime) = let lastTick = forward(firstTick).AddTicks -1L (firstTick, lastTick) match period with | Year(y) -> getBoundaries (DateTime(y, 1, 1)) (fun d -> d.AddYears 1) | Month(y, m) -> getBoundaries (DateTime(y, m, 1)) (fun d -> d.AddMonths 1) | Day(y, m, d) -> getBoundaries (DateTime(y, m, d)) (fun d -> d.AddDays 1.0)
本文介绍在F#中如何使用Discriminated Union来达到类似函数重载的效果,通过定义Period类型并实现Inperiod和BoundariesInperiod函数,展示了在不支持传统重载的情况下灵活处理不同时间周期的方法。

363

被折叠的 条评论
为什么被折叠?



