2015-11-25 29 views
9

考慮下面的代碼:F#:減少該功能

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

findCoefficient返回一個小數點,scoresMap<string, decimal>

現在,當我寫這篇文章的代碼在Visual Studio中,F#電動工具給我這個皮棉建議/警告:

林特:如果沒有可變參數是部分AP在函數調用鏈中,然後函數調用和lambda可以用組合替換。例如fun -> x |> isValid |> not可以替換爲isValid >> not

在這種情況下我該怎麼做?

+0

不確定此處警告是否適用 – Sehnsucht

+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 -> 
    value |> (*) (findCoefficient coeff key) |> (+) state) 0m 

現在你可以做什麼的棉短絨表明,這是把它變成一個功能組成:

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

這不是我曾經要在實踐中去寫,但你可以看到在其他(合理)情況下linter遵循的規則如何應用於此。但是,我建議在F# PowerTools中提出一個問題,建議當函數涉及二元運算符時,linter不應該給出愚蠢的建議:-)。

+0

直接在[FSHarpLint](https://github.com/fsprojects/FSharpLint)上報告會更好嗎? –

+0

可能,我不確定!但無論哪種方式,它都會觸及作者。 –