F#:减少此功能

时间:2015-11-25 12:46:34

标签: f# lint

考虑以下代码:

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

findCoefficient返回小数,scoresMap<string, decimal>

现在当我在Visual Studio中编写这段代码时,F#Power Tools给了我这个lint建议/警告:

  

Lint :如果在函数调用链中没有部分应用可变参数,那么函数调用和lambda可以用composition替换。例如fun -> x |> isValid |> not可以替换为isValid >> not

在这种情况下我该怎么做?

1 个答案:

答案 0 :(得分:9)

这是来自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

现在你可以做linter所建议的,即把它变成一个函数组合:

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

这不是我曾经想要在实践中写的东西,但你可以看到linter在其他(合理的)情况下遵循的规则如何适用于此。但我建议用F# PowerTools打开一个问题,建议当函数涉及二元运算符时,linter不应该给出愚蠢的建议: - )。