Je suis tombé sur un morceau de code Haskell qui ressemble à ceci:
ps@(p:pt)
Que fait le @
symbole signifie dans ce contexte? Je n'arrive pas à trouver d'informations sur Google (il est malheureusement difficile de rechercher des symboles sur Google), et je ne trouve pas la fonction dans la documentation Prelude, donc j'imagine que ce doit être une sorte de sucre syntaxique à la place.
Oui, c'est juste du sucre syntaxique, avec @
Lu à haute voix comme "as". ps@(p:pt)
vous donne des noms pour
ps
p
pt
Sans le @
, Vous devez choisir entre (1) ou (2) :( 3).
Cette syntaxe fonctionne en fait pour tout constructeur; si vous avez data Tree a = Tree a [Tree a]
, alors t@(Tree _ kids)
vous donne accès à la fois à l'arborescence et à ses enfants.
Le @
Le symbole est utilisé à la fois pour donner un nom à un paramètre et pour faire correspondre ce paramètre à un modèle qui suit le @
. Il n'est pas spécifique aux listes et peut également être utilisé avec d'autres structures de données.
Ceci est utile si vous voulez "décomposer" un paramètre en ses parties tout en ayant besoin du paramètre dans son ensemble quelque part dans votre fonction. Un exemple où c'est le cas est la fonction tails
de la bibliothèque standard:
tails :: [a] -> [[a]]
tails [] = [[]]
tails xxs@(_:xs) = xxs : tails xs
Je veux ajouter que @
fonctionne à tous les niveaux, ce qui signifie que vous pouvez le faire:
let a @ (b @ (Just c), Just d) = (Just 1, Just 2) in (a, b, c, d)
Ce qui produira alors ceci: ((Just 1, Just 2), Just 1, 1, 2)
Donc, fondamentalement, c'est un moyen pour vous de lier un motif à une valeur. Cela signifie également qu'il fonctionne avec le type de modèle any, pas seulement les listes, comme illustré ci-dessus. C'est une chose très utile à savoir, car cela signifie que vous pouvez l'utiliser dans de nombreux autres cas.
Dans ce cas, a
est l'entier Maybe Tuple
, b
n'est que le premier Just
dans le tuple, et c
et d
sont les valeurs contenues dans le premier et le deuxième Just
dans le Tuple respectivement
Pour ajouter à ce que les autres ont dit, ils sont appelés as-patterns (en ML la syntaxe utilise le mot-clé "as"), et sont décrits dans la section du rapport Haskell sur modèles .