Usos de Γ
El uso principal de la función incorporada Γ
, conocida como coincidencia de patrones en listas o deconstrucción de listas , es dividir una lista en cabeza y cola, y aplicar una función binaria en ellas. Esto corresponde al patrón de coincidencia de patrones de Haskell
f (x : xs) = <something>
f [] = <something else>
donde <something>
es una expresión que contiene x
, xs
y posiblemente f
. Hay 4 sobrecargas Γ
, cada una de las cuales funciona un poco diferente.
list
La primera sobrecarga, list
toma un valor a
y una función binaria f
. Devuelve una nueva función que toma una lista, devuelve a
si está vacía y llama f
a la cabeza y la cola si no está vacía. Por ejemplo, Γ_1€
toma una lista, devuelve -1
si está vacía, y el índice de la primera aparición del primer elemento en la cola si no.
listN
La segunda sobrecarga, listN
es similar a list
, excepto que a
se omite y en su lugar se usa el valor predeterminado del tipo de retorno. Por ejemplo, Γ€
es equivalente a Γ0€
, ya que el valor numérico predeterminado es 0
.
En la práctica, listN
se usa con más frecuencia list
, ya que el valor predeterminado es irrelevante o exactamente lo que necesita. Un patrón común es Γ~αβγ
, donde αβγ
hay tres funciones; esto se aplica β
al primer elemento y γ
a la cola, y combina los resultados con α
. Se usó, por ejemplo, en esta respuesta . Otros patrones incluyen Γo:α
para aplicar α
solo al primer elemento y Γ·:mα
para aplicar α
a todos los elementos excepto el primero. Este último se usó en esta respuesta .
listF
La tercera sobrecarga es un poco más complicada. Al igual list
, toma un valor a
y una función f
, y devuelve una nueva función g
que toma una lista. Sin embargo, esta vez f
toma un argumento de función adicional, que es en g
sí mismo, y puede invocarlo en cualquier valor (incluido, entre otros, el final de la lista de entrada). Esto significa que listF
implementa un esquema de recursión general en las listas.
listF
no se usa con mucha frecuencia, ya que la recursividad explícita con list
/ listN
suele ser de la misma longitud o más corta, como en esta respuesta .
listNF
listNF
es a listF
lo que listN
es list
: a
se omite la entrada y en su lugar se usa el valor predeterminado del tipo de retorno. En raras circunstancias, puede ser más corto que un pliegue derecho, por ejemplo en esta respuesta .
Como ejemplo de las versiones recursivas de Γ
, la función Γλ·:o⁰↔
baraja una lista en el orden primero, último, segundo, penúltimo, tercero, penúltimo, y así sucesivamente.
Pruébalo en línea!
La función f
es la lambda explícita λ·:o⁰↔
, cuyo argumento ⁰
es la función completa. Lo que f
hace es invertir la cola con ↔
, luego llamar a la función principal de forma recursiva o⁰
y finalmente clavar la cabeza hacia atrás con ·:
. Por supuesto, Γ·:o₀↔
es un byte más corto, pero no funciona si la línea contiene algo más que esta función.