2016-11-09 155 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