Ezt a függvényt először hívják:
merge(Xs,Ys) -> lists:reverse(mergeL(Xs,Ys,[])).
A mergeL-nek átadott üres lista [] az akkumulátor – innen jön a válasz. Ne feledje, hogy az első függvény a mergeL-t hívja meg - a bal oldali merge.
Tegyük fel, hogy ezt a függvényt így hívják:
merge([1, 2, 3], [a, b, c])
Két azonos hosszúságú lista. Ez az első függvény ezután meghívja a mergeL-t:
mergeL([X|Xs],Ys,Zs) -> mergeR(Xs,Ys,[X|Zs]);
mergeL([],[],Zs) -> Zs.
A bal oldali összevonásban 2 kitétel található. Az argumentumokkal rendelkező mergeL hívás felülről lefelé sorrendben egyezik meg ezekkel a záradékokkal.
E záradékok közül a másodiknak három paramétere van – ezek közül az első kettő üres lista []. Azonban amikor először mergeL-nek hívják, ez a két lista nem üres, hanem az Xs és Ys listák, tehát az első záradék egyezik.
Törjük szét a meccseket. Ez az egyesítés felhívása:
mergeL([1, 2, 3], [a, b, c], [])
és a következő módon illeszkedik az első tagmondathoz:
X = 1
Xs = [2, 3]
Ys = [a, b, c]
Zs = []
Ennek oka a lista speciális formája:
[X | Xs]
Ez azt jelenti, hogy az X-et a lista elejére kell illeszteni (egy egyedi elemre), és az X-eket a lista (lista) végére kell állítani.
Ezután felállítjuk az új függvényhívást. Hozzáadhatjuk az X értéket a Zs lista elejéhez, ugyanúgy, ahogy a mintával párosítottuk, így megkapjuk az első mergeR hívást:
mergeR([2, 3], [a, b, c], [1])
Az utolsó argumentum egy egyelemes lista, amelyet egy üres lista élére adunk.
Ez a cipzár a végéig.
Valójában a mergeL utolsó kitétele redundáns. Ez a funkció definíció szerint kimerül a mergeR utolsó záradékában (de ezt meghagyom gyakorlatnak az olvasó számára).
28.06.2009