2015-06-04 15 views
5

Sono abbastanza nuovo a F # e sto avendo un momento difficile cercando di estrarre un elenco di valori distinti da un elenco:Come si estrae elementi distinti da un elenco?

let myList = [ 1; 2; 2; 3; 4; 3 ] 
// desired list 
[ 1; 2; 3; 4 ] 

Come posso fare? Vedo che seq ha un metodo distinct, ma non elenchi.

risposta

13
let myList = [ 1; 2; 2; 3; 4; 3 ] 
let distinctList = myList |> Seq.distinct |> List.ofSeq 

Risultato:

> 
val myList : int list = [1; 2; 2; 3; 4; 3] 
val distinctList : int list = [1; 2; 3; 4] 

Avanti F # versione (4.0) avrà List.distinct funzione

+0

Sono un po 'confuso da questo codice (che funziona benissimo). Quindi puoi passare una lista a Seq.distinct? ... no aspetta ... è così perché la lista implementa seq (ehm ... qualunque sia il termine funzionale)? –

+1

Le sequenze in F # sono rappresentate dal tipo 'seq <'T>', che è un alias per 'IEnumerable'. Lista implementa 'IEnumerable' in modo da poter richiamare tutte le funzioni del modulo' Seq' su di esso. Ma se hai bisogno di List come risultato, devi trasformare il risultato 'seq' in elenco usando la funzione' List.ofSeq'. – Petr

+0

OK, questo ha senso. Grazie! –

3

Non sono sicuro se migliore o peggiore di Petr answer, ma si potrebbe anche fare:

let distinct xs = xs |> Set.ofList |> Set.toList 

> distinct [ 1; 2; 2; 3; 4; 3 ];; 
val it : int list = [1; 2; 3; 4] 
+0

Grazie per la funzione riutilizzabile! F # è cool. : D –

Problemi correlati