Использование Γ
Основное использование встроенной функции Γ
, известной как сопоставление с образцом в списках или деконструкция списка , состоит в том, чтобы разбить список на голову и хвост и применить к ним двоичную функцию. Это соответствует идиоме паттерна Хаскелла
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₀↔
это на байт короче, но не работает, если строка содержит что-то еще, кроме этой функции.