Bene, non è possibile.
Set
è un tipo astratto[0] che nasconde deliberatamente la sua rappresentazione interna, soprattutto per mantenere invarianti della struttura dati che non possono essere staticamente-imposto dal sistema tipo (specificamente, la libreria standard Data.Set.Set
è un albero di ricerca binario).
Perdere la possibilità di associare il modello a un tipo di dati astratto è un po 'spiacevole di danno collaterale, ma vabbè. Le tue opzioni sono approssimativamente:
- Utilizzare predicati e guardie booleani, ad es.
null
, come nella risposta di trinithis.
- Convertire il
Set
in un elenco. La maggior parte delle volte questo è sciocco, ma se vuoi scorrere l'insieme comunque, funziona abbastanza bene.
- Abilita GHC's
ViewPatterns
extension, che fornisce zucchero sintattico per l'utilizzo delle funzioni di accesso dove normalmente si verifica una corrispondenza di modello.
- Evitare di fare questo tipo di controlli in primo luogo - se si dispone di un
Set
, trattarlo come un set, e lavorare con esso nel suo complesso per la mappatura, il filtro, ecc. Non sempre possibile, ma può portare per un codice più pulito con meno condizionali/iterazioni esplicite.
Visualizza modelli lascerebbero si scrive qualcosa che assomiglia a questo:
foo (setView -> EmptySet) = []
foo (setView -> NonEmpty set) = other_thing
... dove setView
è una funzione che si scrive. Non c'è molto di un guadagno qui, ma può essere piacevole per maggiori complessi pseudo-modelli
Per evitare controlli espliciti, oltre ben note operazioni di set, come union
e intersection
, considerano facendo uso del filter
, partition
, map
, e fold
funzioni in Data.Set
.
[0]: Vedere this paper (avviso: PDF) per la definizione del termine come lo sto usando.
fonte
2010-07-25 01:06:28
+1 per il riferimento ViewPatterns! – ShiDoiSi