Вот еще один (при условии отсортированного ввода):
type DateTime = System.DateTime
let filterDayOrFollowing day (input:DateTime[]) =
(input, ([], None))
||> Array.foldBack (fun date (acc, following:DateTime option) ->
if date.Day = day then date::acc, None
else match following with
| Some f when date.Year = f.Year
&& date.Month = f.Month
&& date.Day < day -> f::acc, None
| _ -> acc, Some date)
|> fst
let expected = [ DateTime(2010, 2, 2)
DateTime(2010, 3, 2)
DateTime(2010, 4, 4) ]
let actual =
[| DateTime(2010, 2, 1)
DateTime(2010, 2, 2)
DateTime(2010, 2, 5)
DateTime(2010, 2, 6)
DateTime(2010, 3, 1)
DateTime(2010, 3, 2)
DateTime(2010, 4, 1)
DateTime(2010, 4, 4) |]
|> filterDayOrFollowing 2
actual = expected |> printfn "actual = expected: %b"