Не задумываясь, есть несколько основных функциональных рефакторингов, которые вы можете сделать. Например, при расчете bestAverageOfN
вы можете использовать состав функции:
let bestAverageOfN n =
times
|> Array.toList
|> getAllSubsetsOfLengthN n
|> Seq.map (Seq.toArray >> average)
|> Seq.min
Кроме этого и предложения desco, я не думаю, что я что-то изменил бы. Если вы не используете свою специальную функцию average
где-либо в коде, вы можете написать ее как лямбда-функцию, но это действительно зависит от ваших личных предпочтений.
Просто ради общности, я бы, вероятно, сделал times
аргументом bestAverageOfN
:
let bestAverageOfN n times =
times
|> Seq.windowed n
|> Seq.map (fun set ->
(Array.sum set - Array.min set - Array.max set) / float (set.Length - 2))
|> Seq.min