Utilisations de Γ
L'utilisation principale de la fonction intégrée Γ
, connue sous le nom de correspondance de motifs sur des listes ou de déconstruction de listes , est de diviser une liste en une tête et une queue et d'y appliquer une fonction binaire. Cela correspond à l'idiome de correspondance du motif Haskell
f (x : xs) = <something>
f [] = <something else>
où <something>
est une expression contenant x
, xs
et éventuellement f
. Il y a 4 surcharges de Γ
, chacune fonctionnant un peu différemment.
list
La première surcharge,, list
prend une valeur a
et une fonction binaire f
. Il retourne une nouvelle fonction qui prend une liste, retourne a
si elle est vide et appelle f
sur la tête et la queue si elle n'est pas vide. Par exemple, Γ_1€
prend une liste, retourne -1
si elle est vide et l'index de première occurrence du premier élément dans la queue sinon.
listN
La deuxième surcharge,, listN
est similaire à list
, sauf qu'elle a
est omise et que la valeur par défaut du type de retour est utilisée à la place. Par exemple, Γ€
est équivalent à Γ0€
, car la valeur numérique par défaut est 0
.
En pratique, listN
est utilisé plus souvent que list
, car la valeur par défaut n'est pas pertinente ou correspond exactement à ce dont vous avez besoin. Un modèle commun est Γ~αβγ
, où αβγ
sont trois fonctions; cela s'applique β
au premier élément et γ
à la queue, et combine les résultats avec α
. Il a été utilisé par exemple dans cette réponse . D'autres modèles incluent l' Γo:α
application α
uniquement au premier élément et l' Γ·:mα
application α
à tous les éléments sauf le premier. Ce dernier a été utilisé dans cette réponse .
listF
La troisième surcharge est un peu plus compliquée. Comme list
ça, ça prend une valeur a
et une fonctionf
, et renvoie une nouvelle fonction g
qui prend une liste. Cependant, cette fois f
prend un argument de fonction supplémentaire, qui est g
lui - même, et peut l'appeler sur n'importe quelle valeur (y compris, mais sans s'y limiter, la queue de la liste d'entrée). Cela signifie que listF
implémente un schéma général de récursivité sur les listes.
listF
n'est pas utilisé très souvent, car la récursivité explicite avec list
/ listN
est généralement de la même longueur ou plus courte, comme dans cette réponse .
listNF
listNF
est à listF
ce qui listN
est à list
: l'entrée a
est omise et la valeur par défaut du type de retour est utilisée à la place. Dans de rares circonstances, il peut être plus court qu'un pli droit, par exemple dans cette réponse .
À titre d'exemple des versions récursives de Γ
, la fonction Γλ·:o⁰↔
mélange une liste dans l'ordre premier, dernier, deuxième, avant-dernier, troisième, avant-dernier, etc.
Essayez-le en ligne!
La fonction f
est la lambda expliciteλ·:o⁰↔
, dont l'argument ⁰
est la fonction entière. Ce qui f
ne fait qu'inverser la queue avec ↔
, puis appeler la fonction principale récursivement avec o⁰
, et enfin clouer la tête en arrière avec ·:
. Bien sûr, Γ·:o₀↔
est un octet plus court, mais ne fonctionne pas si la ligne contient autre chose que cette fonction.