traverse
transforme les choses à l'intérieur de a Traversable
en Traversable
des choses «à l'intérieur» de an Applicative
, étant donné une fonction qui fait Applicative
des choses à partir des choses.
Utilisons Maybe
comme Applicative
et listons comme Traversable
. Nous avons d'abord besoin de la fonction de transformation:
half x = if even x then Just (x `div` 2) else Nothing
Donc, si un nombre est pair, nous en obtenons la moitié (à l'intérieur de a Just
), sinon nous obtenons Nothing
. Si tout se passe "bien", cela ressemble à ceci:
traverse half [2,4..10]
--Just [1,2,3,4,5]
Mais...
traverse half [1..10]
-- Nothing
La raison est que la <*>
fonction est utilisée pour construire le résultat, et quand l'un des arguments est Nothing
, nous Nothing
revenons.
Un autre exemple:
rep x = replicate x x
Cette fonction génère une liste de longueur x
avec le contenu x
, par exemple rep 3
= [3,3,3]
. Quel est le résultat traverse rep [1..3]
?
Nous obtenons les résultats partiels [1]
, [2,2]
et l' [3,3,3]
utilisation rep
. Maintenant , la sémantique des listes comme Applicatives
est « prendre toutes les combinaisons », par exemple , (+) <$> [10,20] <*> [3,4]
est [13,14,23,24]
.
"Toutes les combinaisons" de [1]
et [2,2]
sont deux fois [1,2]
. Toutes les combinaisons de deux fois [1,2]
et [3,3,3]
six fois [1,2,3]
. Donc nous avons:
traverse rep [1..3]
--[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]