2016-04-14 3 views
5

Sto guardando l'esempio zip su http://elm-lang.org/examples/zip e ho avuto una domanda su cosa significa esattamente il _ in Elm.Cosa significa _ in Elm?

zip : List a -> List b -> List (a,b) 
zip xs ys = 
    case (xs, ys) of 
    (x :: xs', y :: ys') -> 
     (x,y) :: zip xs' ys' 

    (_, _) -> 
     [] 

La mia impressione è che significhi "tutto il resto" ma ciò significa un valore valido? Cosa succede se non c'è valore?

+1

Come descritto da Dennis Reimann in questo articolo. https://dennisreimann.de/articles/elm-data-structures-record-tuple.html "Utilizzando _ è possibile definire segnaposto per valori che verranno ignorati o ignorati." –

risposta

8

_ viene utilizzato per abbinare qualsiasi cosa in cui non ti interessa il valore, quindi è comunemente usato per abbinare il caso "tutto il resto".

Nel codice di esempio (_, _) corrisponderà a qualsiasi tupla con 2 valori in essa. Si noti che potrebbe anche essere sostituito con solo _ poiché si finisce per non preoccuparsi di entrambi i valori. Un esempio più illustrativo sarebbe dove vi preoccupate per un valore della tupla ma non l'altro, ad esempio la realizzazione di fstin the core package

fst : (a,b) -> a 
fst (a,_) = 
    a 

Non ci interessa circa il secondo valore nella tupla, in modo che solo corrisponde a un _ in quella posizione.

Non v'è alcun null o undefined a Elm, in modo da non devono preoccuparsi di non essere "nessun valore" (se qualcosa non avrebbe alcun valore, il tipo Maybe viene utilizzato).

+0

Grazie per la spiegazione! Nell'esempio zip, poiché List a e List b possono avere lunghezze diverse, anche il caso (_, _) si prende cura dello scenario in cui a o b hanno lunghezze diverse? In tal caso, uno dei valori "_" non sarebbe inesistente? – wmock

+0

Sì, uno o entrambi gli elenchi saranno una lista vuota ('[]') se non corrisponde al primo caso (non inesistente, solo vuoto: P). '_' corrisponderà a qualsiasi cosa, inclusa una lista vuota. – robertjlooby

+0

Quindi, se sto capendo correttamente, quando '(zip [] [])' succede, non cadrà nel primo caso perché non puoi destrutturare un array vuoto, e quindi raggiungi il secondo caso e da allora '_' accetta qualsiasi lista, restituisce qui una lista vuota. È esatto? E per confermare, se l'ORDINE dei 2 casi è cambiato, questa funzione sarebbe errata perché sarebbe sempre caduta nel primo caso? – wmock