考虑以下代码:
scores |> Map.fold (fun state key value ->
state + (findCoefficient conversion.Coefficients key) * value)
0m
Run Code Online (Sandbox Code Playgroud)
findCoefficient返回一个小数,scores是一个Map<string, decimal>
现在当我在Visual Studio中编写这段代码时,F#Power Tools给了我这个lint建议/警告:
Lint:如果在函数调用链中没有部分应用可变参数,那么函数调用和lambda可以用composition替换.例如
fun -> x |> isValid |> not可以替换为isValid >> not
在这种情况下我该怎么做?
这是一个很糟糕的建议,但它遵循一个有效的推理.
我替换conversion.Coefficient原始片段使其缩短:
scores |> Map.fold (fun state key value ->
state + (findCoefficient coeff key) * value) 0m
Run Code Online (Sandbox Code Playgroud)
如果在F#中有二进制运算符a + b,则可以将其重写为函数应用程序(+) a b- 因此我们可以将上述代码重写为:
scores |> Map.fold (fun state key value ->
(+) state ((*) (findCoefficient coeff key) value)) 0m
Run Code Online (Sandbox Code Playgroud)
现在,这只是一个嵌套的函数应用程序,因此我们可以用|>以下代码重写它:
scores |> Map.fold (fun state key value ->
value |> (*) (findCoefficient coeff key) |> (+) state) 0m
Run Code Online (Sandbox Code Playgroud)
现在你可以做linter建议的东西,即把它变成一个函数组合:
scores |> Map.fold (fun state key ->
(*) (findCoefficient coeff key) >> (+) state) 0m
Run Code Online (Sandbox Code Playgroud)
这不是我会永远想在实践中写的,但你可以看到如下棉短绒其他(合理的)情况下的规则如何适用于此.但是我建议用F#PowerTools打开一个问题,建议当函数涉及二元运算符时,linter不应该给出愚蠢的建议:-).