J'essaie de comprendre le traverseimpl code> implémentation dans SCALAZ-Seven :
def traverseImpl[F[_], A, B](l: List[A])(f: A => F[B])(implicit F: Applicative[F]) = {
DList.fromList(l).foldr(F.point(List[B]())) {
(a, fbs) => F.map2(f(a), fbs)(_ :: _)
}
}
3 Réponses :
Ce n'est pas si facile à saisir. Je recommande de lire l'article relié au début de Mon article de blog sur le sujet a>. p>
J'ai également fait une présentation sur le sujet lors de la dernière réunion de programmation fonctionnelle à Sydney et vous pouvez trouver les diapositives ici . P>
Si je peux essayer d'expliquer en quelques mots, L'interaction principale de la liste et de l'application est avec l'application à partir de là, vous voyez que la mise en œuvre d'autres instances de traverse code> va traverser chaque élément de la liste une par une, à la ré-construire éventuellement la ré-construisant la liste
(_ :: _) code> mais accumule / exécutant une sorte de "effets" comme indiqué par le
f applicatif code>. Si
f code> est
état code> Il garde une trace de certains états. Si
f code> est l'application correspondant à un
monoïde code> il s'agit d'une sorte de mesure pour chaque élément de la liste. P>
map2 code> où il reçoit un élément
f [b] code> et joignez-le à l'autre
f [Liste [B]] code> Éléments par définition de
f code> en tant que
applicatif code> et à l'utilisation de la liste
list code> constructeur
: : code> comme fonction spécifique à appliquer. p>
traverse code> est uniquement environ
appliquer code> ing les constructeurs de données de la structure de données que vous souhaitez traverser. Si vous souhaitez regarder la présentation PowerPoint liée, vous verrez des diapositives avec une traversée d'arbre binaire. P>
En effet, votre article de votre blog et vos diapositives sont utiles!
Grandes diapositives! Pourriez-vous faire un pdf? J'ai eu des problèmes ennuyeux avec les polices et l'alignement.
J'ai téléchargé les diapositives PDF ici: Slideshare.net/ettorreborre / ...
Un applicateur vous permet d'appliquer une fonction dans un contexte à une valeur dans un contexte. Donc, par exemple, vous pouvez appliquer liste a deux représentations, soit liste Ceci peut être utilisé pour calculer la longueur d'une liste. Compte tenu de la liste Ceci peut également être utilisé pour créer em> une autre liste: p > certains ((i: int) => i + 1) code> à
certains (3) code> et obtenir
certains (4) code>. Oublions ça pour l'instant. Je reviendrai à cela plus tard.
nil code> ou
tête :: queue code>. Vous pouvez être utilisé pour le replier à l'aide de
repliolft code> mais il y a un autre moyen de se replier: p>
(1, 2) code> Nous replions la liste en appliquant la fonction à partir du côté droit - même si nous déconstruisons vraiment la liste du côté gauche! P>
(1, 2) code>: p>
def fold[A, B](tree: Tree[A], valueForLeaf: B, functionForNode: (A, B, B) => B): B = {
tree match {
case Leaf => valueForLeaf
case Node(a, left, right) => functionForNode(a,
fold(left, valueForLeaf, functionForNode),
fold(right, valueForLeaf, functionForNode)
)
}
}
Superbe réponse qui ne nécessite aucune connaissance externe
Liste # pliard code> souffle la pile pour les grandes listes. Essayez ceci dans un repli:
List.range(0, 10000).foldRight(())((a, b) => ())