155 votes

Que signifie le « @ » symbole moyenne en ce qui concerne les listes en Haskell ?

Je suis tombé sur un morceau de code Haskell qui ressemble à ceci :

Ce que fait le `` symbole signifie dans ce contexte ? Je n’arrive pas à trouver des infos sur Google (il est malheureusement difficile de rechercher des symboles sur Google), et je ne peux pas trouver la fonction dans la documentation de prélude, donc j’imagine que ce doit être une sorte de sucre syntaxique au lieu de cela.

208voto

Nathan Sanders Points 10641

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

  1. la liste: ps
  2. la liste du tête : p
  3. la liste de la queue: pt

Sans l' @, vous aurez à choisir entre (1) ou (2):(3).

Cette syntaxe fonctionne réellement pour tout constructeur; si vous avez data Tree a = Tree a [Tree a], alors t@(Tree _ kids) vous donne accès à la fois l'arbre et de ses enfants.

55voto

sth Points 91594

L' @ Symbole est utilisé pour à la fois donner un nom à un paramètre et le match de ce paramètre à l'encontre d'un schéma qui suit l' @. Ce 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 dans les parties tout en restant le paramètre comme un ensemble quelque part dans votre fonction. Un exemple où c'est le cas c'est l' tails de la fonction de la bibliothèque standard:

tails                   :: [a] -> [[a]]
tails []                =  [[]]
tails xxs@(_:xs)        =  xxs : tails xs

29voto

Electric Coffee Points 1694

Je tiens à ajouter que @ travaille à 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)

Qui produira alors ceci: ((Just 1, Just 2), Just 1, 1, 2)

Donc, fondamentalement, c'est une façon pour vous de lier un modèle à une valeur. Cela signifie également qu'il fonctionne avec tout type de modèle, pas seulement des listes, comme démontré ci-dessus. C'est une chose très utile de savoir, car cela signifie que vous pouvez l'utiliser dans de nombreux autres cas.

Dans ce cas, a est l'ensemble de l' Maybe Tuple, b n'est que la première Just dans le tuple, et c et d sont les valeurs contenues dans le premier et le second Just dans le tuple respectivement

12voto

newacct Points 42530

Pour ajouter à ce que les autres personnes ont dit, elles sont appelées modèles (en ML, la syntaxe utilise le mot clé "as") et sont décrites dans la section du rapport Haskell sur les modèles .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X