2015-10-13 9 views
7

vorrei definire la seguente funzione:Come filtrare i valori "Niente" da Elm Array?

compactAndConvertToList : Array (Maybe String) -> List String 

Questa funzione dovrebbe rimuovere tutti Nothing apparizioni nella matrice data, e convertirlo in List.

Mi è venuta in mente la soluzione di seguito, ma è un po 'sporca.

C'è un modo migliore per raggiungere questo obiettivo?

import Graphics.Element exposing (..) 
import Array 

model : Array.Array (Maybe String) 
model = Array.fromList [ Just "Hello", Just "Stack", Nothing, Just "Overflow" ] 


compactAndConvertToList : Array.Array (Maybe String) -> List String 
compactAndConvertToList maybeStrings = 
    maybeStrings 
    |> Array.filter (\x -> x /= Nothing) 
    |> Array.map (Maybe.withDefault "") 
    |> Array.toList 


main = 
    model 
    |> compactAndConvertToList 
    |> show 

risposta

13

Se il risultato finale è una lista, si sono probabilmente meglio per convertire solo l'array a un elenco, e quindi operare su di esso.

import Array 

compactAndConvertToList : Array.Array (Maybe String) -> List String 
compactAndConvertToList = Array.toList >> List.filterMap identity 

Se non sei agio con funzioni di ordine superiore, si potrebbe scrivere in questo modo:

compactAndConvertToList arr = List.filterMap identity (Array.toList arr) 

prendiamo il nostro array, si applicano toList ad esso, quindi applicare filterMap con esso. La mappa dei filtri prende una funzione che produce un forse e la applica a ogni elemento nell'elenco, scartando i casi Nothing. Applichiamo semplicemente le funzioni di identità, che scarta i valori Nothing già presenti.

In generale, gli array sono adatti per un accesso casuale rapido, ma se si attraversano l'intera raccolta un numero di volte, le liste tenderanno ad essere più veloci. Ma, inizia sempre a farlo in modo chiaro, quindi ottimizza se necessario.

+0

Grazie mille! Mi piace la prima versione con '>>'. Domande un po 'non correlate riguardo a 'Array' vs' List': Per costruire un modello che rappresenta una matrice bidimensionale (per [questo gioco] (http://fgcos.com/puzzle/barley-break), per esempio), è meglio usare 'Array' di' Array's? Non sono riuscito a trovare come ottenere un oggetto in un indice specifico in un 'Elenco'. –

+0

Sì, sicuramente non vuoi liste per questo, cercare un elemento specifico è molto lento. Array of Arrays è la soluzione migliore. – jmite

+0

Fresco. Grazie per l'aiuto! –

0

Forse questa è una risposta migliore come nel 2018. Utilizzare un pacchetto elm-community/maybe-extra.

Esempio:

Maybe.Extra.values [Just 1, Nothing, Just 3] 

Ritorni:

[1,3] 
Problemi correlati