Вот версия F #, основанная на ранее опубликованной версии C #. Основное различие заключается в том, что оно скорее обязательное, чем императивное (без изменяемых переменных).
#light
let conversions = [|
365, "Year", "Years"
30, "Month", "Months"
7, "Week", "Weeks"
1, "Day", "Days" |]
let ToDuration numDays =
conversions
|> Array.fold_left (fun (remainDays,results) (n,sing,plur) ->
let count = remainDays / n
if count >= 1 then
remainDays - (count * n),
(sprintf "%d %s" count (if count=1 then sing else plur)) :: results
else
remainDays, results
) (numDays,[])
|> snd |> (fun rs -> System.String.Join(", ", List.rev rs |> List.to_array))
printfn "%s" (ToDuration 1008)