traversetrasforma le cose dentro a Traversablein una Traversabledelle cose "dentro" una Applicative, data una funzione che fa Applicatives fuori dalle cose.
Usiamo Maybeas Applicativeed 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 Nothingindietro.
Un altro esempio:
rep x = replicate x x
Questa funzione genera un elenco di lunghezza xcon 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]]