web-dev-qa-db-fra.com

Que signifie le symbole "@" en référence aux listes dans Haskell?

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.

114
mipadi

Oui, c'est juste du sucre syntaxique, avec @ Lu à haute voix comme "as". ps@(p:pt) vous donne des noms pour

  1. la liste: ps
  2. la tête de la liste: p
  3. la queue de la liste: 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.

162

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
39
sth

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

19
Electric Coffee

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 .

8
newacct