2016-11-09 78 views
6

我試圖重新實現List.distinct功能:奇怪FSharpLint警告

let inline distinct list = 
    let folder curr = function 
     | [] -> [curr] 
     | l -> if List.contains curr l then l else curr :: l 
    List.foldBack folder list [] 
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

我得到了皮棉警告說

List.foldBack f x []也許能夠被重構到x

然而,這對我來說沒有多大意義,因爲這導致我返回原始列表而不執行di操作邏輯的邏輯。

這是FSharpLint的錯誤嗎?

+3

可能是一個錯誤。如果這是一個摺疊而不是折返的話,這將是一個相當合理的。 – scrwtp

+0

我必須指出,這個功能絕對不會做你認爲它的功能。從「folder」的兩個參數都是列表開始,這意味着「distinct」的參數必須是列表的列表。 –

+0

@Fyodor我不明白你的意思,因爲我已經在FSI嘗試過,函數的類型是「列表 - >'列表'a:平等'。並輸入'[1; 0; 0]'它給了我''1的正確輸出。 0]'。我複製了錯誤的東西嗎? – rexcfnghk

回答

6

顯然這是一個錯誤的規則。看看本文節選自FSharpLint的default configuration

List.fold f x [] ===> x 
Array.fold f x [||] ===> x 
List.foldBack f x [] ===> x 
Array.foldBack f x [||] ===> x 

這對foldfoldback這裏一樣,所以它不遵循兩者之間的簽名差異。

應翻轉初始狀態和收集參數的順序,請參見foldback定義中使用的"mnemonic" approach

+1

謝謝。我已經發送了[PR到FSharLint](https://github.com/fsprojects/FSharpLint/pull/190)來解決這個問題。 – rexcfnghk