考虑以下代码:
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建议/警告:
Lint :如果在函数调用链中没有部分应用可变参数,那么函数调用和lambda可以用composition替换。例如
fun -> x |> isValid |> not
可以替换为isValid >> not
在这种情况下我该怎么做?
答案 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不应该给出愚蠢的建议: - )。