Эта функция вызывается первой:
merge(Xs,Ys) -> lists:reverse(mergeL(Xs,Ys,[])).
Пустой список [], переданный в mergeL, является аккумулятором - отсюда и ответ. Обратите внимание, что первая функция вызывает mergeL - левое слияние.
Давайте представим, что эта функция называется так:
merge([1, 2, 3], [a, b, c])
Два списка одинаковой длины. Затем эта первая функция вызывает mergeL:
mergeL([X|Xs],Ys,Zs) -> mergeR(Xs,Ys,[X|Zs]);
mergeL([],[],Zs) -> Zs.
В левом слиянии есть 2 предложения. Вызов mergeL с аргументами будет сопоставлять эти предложения в порядке сверху вниз.
Второй из этих пунктов имеет три параметра - первые два из них являются пустыми списками []. Однако при первом вызове mergeL эти два списка не пусты, это списки X и Y, поэтому первое предложение совпадает.
Позволяет разорвать спички. Это призыв к слиянию:
mergeL ([1, 2, 3], [a, b, c], [])
и соответствует первому предложению следующим образом:
X = 1
Xs = [2, 3]
Ys = [a, b, c]
Zs = []
Это из-за особой формы списка:
[X | Xs]
Это означает, что X соответствует заголовку списка (отдельный элемент) и делает Xs хвостом списка (списка).
Затем мы создаем новый вызов функции. Мы можем добавить значение X в начало списка Zs так же, как мы сопоставили его с шаблоном, чтобы мы получили первый вызов mergeR:
mergeR ([2, 3], [a, b, c], [1])
Последний аргумент - это список из одного элемента, вызванный добавлением элемента в начало пустого списка.
Это проносится до конца.
На самом деле последнее предложение mergeL является излишним. По определению эта функция будет исчерпана в последнем пункте mergeR (но я оставлю это как упражнение для читателя).