Je suis tombé sur un morceau de code Haskell qui ressemble à ceci:
ps@(p:pt)
Que signifie le @
symbole 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 qu'il doit s'agir d'une sorte de sucre syntaxique à la place.
@
sur cette page l'explique.Réponses:
Oui, c'est juste du sucre syntaxique, avec
@
lu à haute voix comme "comme".ps@(p:pt)
vous donne des noms pourps
p
pt
Sans le
@
, vous devrez choisir entre (1) ou (2) :( 3).Cette syntaxe fonctionne en fait pour n'importe quel constructeur; si c'est le cas
data Tree a = Tree a [Tree a]
, alorst@(Tree _ kids)
vous donne accès à l'arbre et à ses enfants.la source
Le
@
symbole est utilisé à la fois pour donner un nom à un paramètre et 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
tails
fonction de la bibliothèque standard:la source
Je veux ajouter que cela
@
fonctionne à tous les niveaux, ce qui signifie que vous pouvez le faire:Ce qui produira alors ceci:
((Just 1, Just 2), Just 1, 1, 2)
Donc, fondamentalement, c'est un moyen pour vous de lier un modèle à une valeur. Cela signifie également qu'il fonctionne avec n'importe quel type de modèle, pas seulement des listes, comme démontré 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 le toutMaybe Tuple
,b
est juste le premierJust
dans le tuple etc
etd
sont les valeurs contenues dans le premier et le secondJust
dans le tuple respectivementla source
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 les patterns .
la source