2016-11-09 13 views
6

Próbuję reimplement List.distinct funkcję:Strange FSharpLint ostrzeżenie

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

Dostałem ostrzeżenie niestrzępiącą który mówi

List.foldBack f x [] może być w stanie być refactored do x

Jednak nie ma to dla mnie większego sensu, ponieważ to prowadzi mnie do powrotu na pierwotną listę bez wykonywania di złośliwa logika.

Czy to błąd FSharpLint?

+3

Może to być błąd. Byłoby to całkiem rozsądne, gdyby nieco dziwaczna wiadomość, gdyby była spasowana, a nie składana. – scrwtp

+0

Muszę zaznaczyć, że ta funkcja zdecydowanie nie robi tego, co myślisz. Zacznijmy od tego, że oba parametry "folderu" to listy, co oznacza, że ​​parametr "odrębny" musi być listą list. –

+0

@Fyodor Nie rozumiem co masz na myśli, tak jak próbowałem w FSI, a typ funkcji to ''lista ->' lista, gdzie" a: równość ". I z wprowadzeniem "[1; 0; 0] 'dał mi poprawne wyjście' [1; 0] '. Czy skopiowałem coś źle? – rexcfnghk

Odpowiedz

6

Podobno jest to zła reguła. Spójrz na ten fragment z FSharpLint na default configuration:

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

To samo dla fold i foldback tutaj, więc nie wynika z różnic w podpisach między nimi.

Kolejność początkowych argumentów dotyczących stanu i kolekcji powinna być odwrócona, patrz definicja "mnemonic" approach użyta w definicji .

+1

Dzięki. Wysłałem [PR do FSharLint] (https://github.com/fsprojects/FSharpLint/pull/190), aby to naprawić. – rexcfnghk

Powiązane problemy