traverse
trasforma le cose dentro a Traversable
in una Traversable
delle cose "dentro" una Applicative
, data una funzione che fa Applicative
s fuori dalle cose.
Usiamo Maybe
as Applicative
ed elenchiamo come Traversable
. Per prima cosa abbiamo bisogno della funzione di trasformazione:
half x = if even x then Just (x `div` 2) else Nothing
Quindi, se un numero è pari, ne otteniamo la metà (all'interno di a Just
), altrimenti lo otteniamo Nothing
. Se tutto va "bene", apparirà così:
traverse half [2,4..10]
--Just [1,2,3,4,5]
Ma...
traverse half [1..10]
-- Nothing
Il motivo è che la <*>
funzione viene utilizzata per costruire il risultato e quando uno degli argomenti è Nothing
, torniamo Nothing
indietro.
Un altro esempio:
rep x = replicate x x
Questa funzione genera un elenco di lunghezza x
con il contenuto x
, ad esempio rep 3
= [3,3,3]
. Qual è il risultato traverse rep [1..3]
?
Otteniamo i risultati parziali [1]
, [2,2]
e [3,3,3]
utilizzare rep
. Ora la semantica delle liste così com'è Applicatives
"accetta tutte le combinazioni", ad esempio (+) <$> [10,20] <*> [3,4]
è [13,14,23,24]
.
"Tutte le combinazioni" di [1]
e [2,2]
sono due volte [1,2]
. Tutte le combinazioni di due volte [1,2]
e [3,3,3]
sono sei volte [1,2,3]
. Quindi abbiamo:
traverse rep [1..3]
--[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]