Все еще в процессе превращения моего кода во все более функциональный стиль и внешний вид.
Здесь у меня есть функция, которую я стараюсь сделать как можно более общей, передавая функцию фильтра ифункция вычисления в качестве параметров.
let calcError filter (fcalc:'a -> float) (arr:'a array) =
arr |> Array.filter filter
|> Array.map fcalc
|> Array.average
Подпись:
val calcError : filter:('a -> bool) -> fcalc:('a -> float) -> arr:'a array -> float
Я считаю, что это довольно стандартно, используя calcError с частичными приложениями.
Однако Array.Среднее значение будет вызывать исключения, если массив имеет размер 0 или равен нулю (что не произойдет в моем случае).
Не большой поклонник исключений в F #, я бы предпочел использовать либо (вывод с плавающей запятой), либоРезультат.
Я бы тогда подумал о написании кода таким образом, но я не уверен, что это правильный способ сделать это в рамках функционального мышления (которое я пытаюсь приобрести).Любое другое решение, которое я, вероятно, смог бы адаптировать для других подобных проблем, конечно, приветствуется.
Спасибо всем
Решение, которое я имею в виду:
let calcError2 filter (fcalc:'a -> float) (arr:'a array) =
let subarr = arr |> Array.filter filter
match subarr.Length with
| 0 -> Result.Error "array length 0"
| _ -> subarr |> Array.map fcalc
|> Array.average
|> Result.Ok