Cette fonction est appelée d'abord:
merge(Xs,Ys) -> lists:reverse(mergeL(Xs,Ys,[])).
La liste vide [] passé à MERGEL est l'accumulateur - c'est là la réponse viendra. Notez que la première fonction appelle mergeL - la fusion à gauche.
Feignons que cette fonction est appelée comme si:
merge([1, 2, 3], [a, b, c])
Deux listes de la même longueur. Cette première fonction appelle ensuite mergeL:
mergeL([X|Xs],Ys,Zs) -> mergeR(Xs,Ys,[X|Zs]);
mergeL([],[],Zs) -> Zs.
Il existe 2 clauses dans la fusion à gauche. L'appel à mergeL avec les arguments correspondra à ces clauses dans l'ordre descendant.
La seconde de ces clauses a trois paramètres - les deux premiers sont des listes vides []. Cependant, la première fois que mergeL est appelée ces deux listes ne sont pas vides, ce sont les listes Xs et Ys qui correspondent à la première clause.
Permet de répartir les résultats. Ceci est l'appel à MERGEL:
MERGEL ([1, 2, 3], [a, b, c], [])
et elle correspond à la première clause de la façon suivante:
X = 1
Xs = [2, 3]
Ys = [a, b, c]
Zs = []
Ceci est dû à la forme particulière de la liste:
[X | Xs]
Cela signifie en jeu X à la tête de la liste (un élément individuel) et faire Xs la queue de la liste (une liste). Nous construisons ensuite le nouvel appel de fonction.
Nous pouvons ajouter la valeur X au début de la liste Z de la même façon que nous l'avons fait pour obtenir le premier appel mergeR:
mergeR ([2, 3], [a, b, c], [ 1])
L'argument final est une liste à un élément causée par l'ajout d'un élément en tête d'une liste vide.
Ceci se zippe jusqu'à la fin.
En fait, la clause finale de mergeL est redondante. Par définition, cette fonction sera épuisée dans la clause finale de mergeR (mais je laisserai cela comme un exercice pour le lecteur).
C'est un excellent moyen de visualiser comment cela fonctionne. – marcc