Я постараюсь объяснить let (a, b) = f tl in (x + a, y + b)
. Может быть, это поможет.
Шаблон для этого случая x :: y :: tl
. Таким образом, это означает, что tl
представляет хвост хвоста списка. Т.е. он представляет список после удаления двух элементов спереди.
В этих же строках x
представляет первый элемент списка, а y
представляет второй элемент.
Рекурсивный вызов f
вернет все, что f
вернет для tl
, и это то, что вы пытаетесь выяснить. Это будет пара чисел, как вы можете сказать из шаблона (a, b)
.
Результат всего выражения (который является результатом f
, за исключением случаев, когда список очень короткий) равен (x + a, y + b)
. Другими словами, он добавляет первый элемент списка к первому номеру пары и второй элемент списка ко второму элементу пары.