type WeekDays = | Monday = 1 | Tuesday = 2 | Wednesday = 3 | Thursday = 4 | Friday = 5
| Saturday = 6 | Sunday = 7
| WeekDays.Monday -> WeekDays.Tuesday
| WeekDays.Tuesday -> WeekDays.Wednesday
| WeekDays.Wednesday -> WeekDays.Thursday
| WeekDays.Thursday -> WeekDays.Friday
| WeekDays.Friday -> WeekDays.Saturday
| WeekDays.Saturday -> WeekDays.Sunday
| WeekDays.Sunday -> WeekDays.Monday
| _ -> failwith "Invalid Week Day"
type ChargeCalc = | J5 | J6 | J7
| WeekDays.Monday -> 1 | WeekDays.Tuesday -> 1 | WeekDays.Wednesday -> 1
| WeekDays.Thursday -> 1 | WeekDays.Friday -> 1
| WeekDays.Sunday -> if charge = J7 then 1 else 0
| _ -> invalidArg "day" "wrong week day"
let countDays charge limit weekday = Seq.unfold(fun (sum, day) ->
if sum >= limit then None else Some (count charge day, (sum + count charge day, nextDay day))) (0, weekday)
[WeekDays.Monday; WeekDays.Tuesday; WeekDays.Wednesday; WeekDays.Thursday; WeekDays.Friday; WeekDays.Saturday; WeekDays.Sunday]
|> List.map (fun d -> d, countDays J6 2 d |> Seq.length)
|> List.map (fun (d, count) -> printfn "%A %d" d count)