foldr et foldl de plus amples explications et des exemples
J'ai regardé les différents plis et pliage en général ainsi que quelques autres, et ils l'expliquent assez bien.
Je suis toujours avoir des problèmes sur la façon dont un lambda pourrait fonctionner dans ce cas.
foldr (\y ys -> ys ++ [y]) [] [1,2,3]
Quelqu'un pourrait-il passer par cette étape-par-étape et essayer de m'expliquer?
Et aussi comment foldl
travail?
OriginalL'auteur Matt | 2010-10-16
Vous devez vous connecter pour publier un commentaire.
À l'aide de
Et
Commençons à déballer:
OriginalL'auteur yfeldblum
foldr est une chose facile:
Elle prend une fonction qui est en quelque sorte similaire à (:),
et une valeur qui est similaire à la liste vide [],
et remplace chaque : et [] dans certains liste.
Il ressemble à ceci:
Vous pouvez l'imaginer foldr que certains de machine d'état-évaluateur, trop:
f est la transition,
et e est l'état de départ.
foldr (foldRIGHT) exécute la machine d'état avec la transition f et le début de l'état e sur la liste des entrées, en commençant à l'extrémité droite. Imaginez f en notation infixe comme le pacman venant de DROITE.
foldl (foldLEFT) fait de même à partir de la GAUCHE, mais la transition de la fonction, écrit en notation infixe, prend son argument d'entrée à partir de la droite. Donc, la machine consomme de la liste, en commençant à l'extrémité gauche. Pacman consomme la liste de GAUCHE avec la bouche ouverte vers la droite, en raison de la bouche (b->->b) au lieu de (a->b->b).
Que ce soit clair, imaginez la fonction moins que la transition:
Vous voudrez probablement utiliser foldr dans les situations où la liste peut être infini, et où l'évaluation doit être paresseux:
Et vous voudrez probablement utiliser la version stricte de foldl, qui est foldl', lorsque vous consommez de l'ensemble de la liste pour produire sa sortie. Il peut mieux jouer et peut vous empêcher d'avoir de la pile de dépassement de capacité ou de capacité de mémoire des exceptions (en fonction du compilateur) en raison de l'extrême longues listes en combinaison avec d'évaluation différée:
La première étape par étape crée une entrée de la liste, les évalue, et il consomme.
Le second crée une très longue formule d'abord, de perdre la mémoire avec ((...((0+1)+2)+3)+...), et évalue l'ensemble de la suite.
Le troisième est identique à la seconde, mais avec l'autre formule.
OriginalL'auteur comonad
La définition de
foldr
est:Voici donc étape par étape de réduction de votre exemple:
OriginalL'auteur sepp2k
Notation infixe sera probablement plus clair ici.
Commençons par la définition:
Pour des raisons de concision, nous allons écrire
g
au lieu de(\y ys -> ys ++ [y])
. Les lignes suivantes sont équivalentes:OriginalL'auteur Bolo