F #: уменьшить эту функцию

139
11

Рассмотрим следующий фрагмент кода:


scores |> Map.fold (fun state key value ->
state + (findCoefficient conversion.Coefficients key) * value)
0m

findCoefficient возвращает десятичное число, а scores - это Map<string, decimal>


Теперь, когда я пишу этот фрагмент кода в Visual Studio, F # Power Tools дает мне это предложение/предупреждение:


Lint: если в цепочке вызовов функций частично не применяются изменчивые аргументы, вызовы функций и лямбда могут быть заменены композицией. например fun -> x |> isValid |> not можно заменить на isValid >> not



Как бы это сделать в этом случае?

спросил(а) 2021-01-25T18:52:41+03:00 4 месяца, 4 недели назад
1
Решение
139

Это ужасный совет от linter, но он следует обоснованным аргументам.


Я заменяю conversion.Coefficient в вашем исходном фрагменте, чтобы сделать его немного короче:


scores |> Map.fold (fun state key value ->
state + (findCoefficient coeff key) * value) 0m

Когда у вас есть двоичный оператор в F #, например a + b, его можно переписать в виде приложения-функции (+) a b - и поэтому мы можем переписать вышеуказанный код как:


scores |> Map.fold (fun state key value ->
(+) state ((*) (findCoefficient coeff key) value)) 0m

Теперь это всего лишь вложенное функциональное приложение, поэтому мы можем переписать его с помощью |>:


scores |> Map.fold (fun state key value ->
value |> (*) (findCoefficient coeff key) |> (+) state) 0m

И теперь вы можете сделать то, что предлагает линкер, чтобы превратить его в состав функции:


scores |> Map.fold (fun state key ->
(*) (findCoefficient coeff key) >> (+) state) 0m

Это не то, что я когда-либо хотел бы написать на практике, но вы можете увидеть, как применяются правила, которые Linter следует в других (разумных) случаях. Но я бы рекомендовал открыть проблему с помощью F # PowerTools, предполагая, что linter не должен давать глупых советов, когда функция включает двоичные операторы: -).

ответил(а) 2021-01-25T18:52:41+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема