traversetransforme les choses à l'intérieur de a Traversableen Traversabledes choses «à l'intérieur» de an Applicative, étant donné une fonction qui fait Applicativedes choses à partir des choses.
Utilisons Maybecomme Applicativeet 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 Nothingrevenons.
Un autre exemple:
rep x = replicate x x
Cette fonction génère une liste de longueur xavec 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 Applicativesest « 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]]