traverser
transforme les choses à l'intérieur d'un Traversable
en un Traversable
de choses "à l'intérieur" d'un Applicative
, en donnant une fonction qui crée des Applicative
à partir de choses.
Utilisons Maybe
comme Applicative
et les listes comme Traversable
. Tout d'abord, nous avons besoin de la fonction de transformation :
moitié x = if even x then Just (x `div` 2) else Nothing
Donc si un nombre est pair, nous obtenons la moitié de celui-ci (à l'intérieur d'un Just
), sinon nous obtenons Nothing
. Si tout se passe "bien", cela ressemble à ceci :
traverser moitié [2,4..10]
--Just [1,2,3,4,5]
Mais...
traverser moitié [1..10]
-- Rien
La raison en est que la fonction <*>
est utilisée pour construire le résultat, et lorsque l'un des arguments est Nothing
, nous obtenons Nothing
en retour.
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 de traverser rep [1..3]
?
Nous obtenons les résultats partiels de [1]
, [2,2]
et [3,3,3]
en utilisant rep
. Maintenant, la sémantique des listes en tant qu'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]
sont six fois [1,2,3]
. Ainsi nous avons :
traverser rep [1..3]
--[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]
3 votes
L'article L'essence du pattern Iterator pourrait être utile car il construit la notion de parcours étape par étape. Certains concepts avancés sont présents cependant