Использование Γ
Основное использование встроенной функции Γ, известной как сопоставление с образцом в списках или деконструкция списка , состоит в том, чтобы разбить список на голову и хвост и применить к ним двоичную функцию. Это соответствует идиоме паттерна Хаскелла
f (x : xs) = <something>
f [] = <something else>
где <something>это выражение , содержащее x, xsи , возможно f. Есть 4 перегрузки Γ, каждая из которых работает немного по-своему.
list
Первая перегрузка, listпринимает значение aи двоичную функцию f. Он возвращает новую функцию, которая принимает список, возвращает, aесли он пуст, и вызывает fголову и хвост , если он не пуст . Например, Γ_1€принимает список, возвращает, -1если он пуст, и индекс первого появления первого элемента в хвосте, если нет.
listN
Вторая перегрузка, listNаналогична list, за исключением того, что aона опущена, и вместо нее используется значение по умолчанию возвращаемого типа. Например, Γ€эквивалентно Γ0€, поскольку числовое значение по умолчанию - 0.
На практике listNиспользуется чаще, чем list, поскольку значение по умолчанию либо не имеет значения, либо именно то, что вам нужно. Распространенная картина Γ~αβγ, где αβγтри функция; это относится βк первому элементу и γк хвосту и объединяет результаты с α. Он был использован, например, в этом ответе . Другие шаблоны включают в себя Γo:αприменение αтолько к первому элементу и Γ·:mαприменение αко всем элементам, кроме первого. Последний был использован в этом ответе .
listF
Третья перегрузка немного сложнее. Мол list, он принимает значение aи функцию fи возвращает новую функцию, gкоторая принимает список. Однако на этот раз он fполучает дополнительный аргумент функции, который gсам по себе, и может вызывать его для любого значения (включая, но не ограничиваясь этим, конец списка ввода). Это означает, что listFреализует общую схему рекурсии в списках.
listFиспользуется не очень часто, поскольку явная рекурсия с list/ listNобычно такой же длины или короче, как в этом ответе .
listNF
listNFявляется listFто , что listNэто list: вход aопущен, а значение по умолчанию типа возвращаемого используются вместо этого. В редких случаях он может быть короче правого сгиба, например, в этом ответе .
В качестве примера рекурсивных версий Γфункция Γλ·:o⁰↔перетасовывает список в следующем порядке: первый, последний, второй, второй-последний, третий, третий-последний и так далее.
Попробуйте онлайн!
Функция f- это явная лямбда λ·:o⁰↔, аргументом которой ⁰является вся функция. Что fделает, так это обратный хвост ↔, затем рекурсивный вызов главной функции o⁰и, наконец, возврат головы ·:. Конечно, Γ·:o₀↔это на байт короче, но не работает, если строка содержит что-то еще, кроме этой функции.