Usos de Γ
O principal uso do built-in Γ
, conhecido como correspondência de padrões em listas ou desconstrução de listas , é dividir uma lista em uma cabeça e cauda e aplicar uma função binária nelas. Corresponde ao idioma correspondente do padrão Haskell
f (x : xs) = <something>
f [] = <something else>
onde <something>
é uma expressão que contém x
, xs
e possivelmente f
. Existem 4 sobrecargas de Γ
, cada uma das quais funciona um pouco diferente.
list
A primeira sobrecarga, list
assume um valor a
e uma função binária f
. Ele retorna uma nova função que pega uma lista, retorna a
se estiver vazia e chama f
a cabeça e a cauda se não estiver vazia. Por exemplo, Γ_1€
pega uma lista, retorna -1
se estiver vazia e o índice da primeira ocorrência do primeiro elemento na cauda, se não estiver.
listN
A segunda sobrecarga,, listN
é semelhante a list
, exceto que a
é omitida e o valor padrão do tipo de retorno é usado. Por exemplo, Γ€
é equivalente a Γ0€
, já que o valor numérico padrão é 0
.
Na prática, listN
é usado com mais frequência do que list
, uma vez que o valor padrão é irrelevante ou exatamente o que você precisa. Um padrão comum é Γ~αβγ
onde αβγ
estão três funções; isso se aplica β
ao primeiro elemento e γ
à cauda e combina os resultados com α
. Foi usado, por exemplo, nesta resposta . Outros padrões incluem Γo:α
a aplicação α
apenas ao primeiro elemento e Γ·:mα
a aplicação α
a todos os elementos, exceto o primeiro. O último foi usado nesta resposta .
listF
A terceira sobrecarga é um pouco mais envolvida. Como list
, é preciso um valor a
e uma função f
e retorna uma nova função g
que leva uma lista. No entanto, esse tempo f
exige um argumento de função extra, que é g
ele próprio, e pode chamá-lo com qualquer valor (incluindo, mas não limitado a, final da lista de entrada). Isso significa que listF
implementa um esquema geral de recursão nas listas.
listF
não é usado com muita frequência, pois a recursão explícita com list
/ listN
geralmente é do mesmo tamanho ou menor, como nesta resposta .
listNF
listNF
é para o listF
que listN
é list
: a entrada a
é omitida e o valor padrão do tipo de retorno é usado. Em raras circunstâncias, pode ser menor que uma dobra à direita, por exemplo, nesta resposta .
Como exemplo das versões recursivas de Γ
, a função Γλ·:o⁰↔
embaralha uma lista na ordem primeiro, último, segundo, penúltimo, terceiro, penúltimo e assim por diante.
Experimente online!
A função f
é a lambda explícita λ·:o⁰↔
, cujo argumento ⁰
é a função inteira. O que f
faz é inverter a cauda com ↔
, em seguida, chame a função principal recursivamente com o⁰
e finalmente enfie a cabeça para trás ·:
. Obviamente, Γ·:o₀↔
é um byte mais curto, mas não funciona se a linha contiver algo além dessa função.