Cosa significa il simbolo "@" in riferimento agli elenchi in Haskell?


128

Mi sono imbattuto in un pezzo di codice Haskell che assomiglia a questo:

ps@(p:pt)

Cosa significa il @simbolo in questo contesto? Non riesco a trovare alcuna informazione su Google (è purtroppo difficile cercare simboli su Google) e non riesco a trovare la funzione nella documentazione di Prelude, quindi immagino che debba essere una sorta di zucchero sintattico.


14
Non cercare di cercare quel simbolo specifico. Cerca la sintassi di Haskell in generale, quindi trova il simbolo in quella discussione generale. Ad esempio, il miglior risultato di Google per "Sintassi di Haskell": cs.utep.edu/cheon/cs3360/pages/haskell-syntax.html . La seconda occorrenza di @su quella pagina lo spiega.
Rob Kennedy,

1
Meno male che ho menzionato esattamente come ho trovato quell'URL, @Iter. Chiunque può ripetere il processo oggi e trovare la risposta in qualsiasi pagina trovino.
Rob Kennedy,

Risposte:


179

Sì, è solo zucchero sintattico, con @letto ad alta voce come "as". ps@(p:pt)ti dà nomi per

  1. la lista: ps
  2. la testa della lista: p
  3. la coda della lista: pt

Senza il @, dovresti scegliere tra (1) o (2) :( 3).

Questa sintassi funziona effettivamente per qualsiasi costruttore; se lo hai data Tree a = Tree a [Tree a], t@(Tree _ kids)ti dà accesso sia all'albero che ai suoi figli.


3
conosci il nome di questa sintassi?
danza,

7
Si chiama "as-pattern"
adamo,

41

Il @simbolo viene utilizzato sia per assegnare un nome a un parametro sia per associare quel parametro a un modello che segue il @. Non è specifico per gli elenchi e può essere utilizzato anche con altre strutture di dati.

Ciò è utile se si desidera "scomporre" un parametro nelle sue parti pur necessitando del parametro nel suo insieme da qualche parte nella funzione. Un esempio in cui questo è il caso è la tailsfunzione della libreria standard:

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

21

Voglio aggiungere che @funziona a tutti i livelli, nel senso che puoi farlo:

let a @ (b @ (Just c), Just d) = (Just 1, Just 2) in (a, b, c, d)

Che quindi produrrà questo: ((Just 1, Just 2), Just 1, 1, 2)

Quindi in pratica è un modo per associare un modello a un valore. Ciò significa anche che funziona con qualsiasi tipo di modello, non solo con gli elenchi, come dimostrato sopra. Questa è una cosa molto utile da sapere, poiché significa che puoi usarla in molti altri casi.

In questo caso, aè l'intero Maybe Tuple, bè solo il primo Justnella tupla ce dsono rispettivamente i valori contenuti nella prima e Justnella seconda nella tupla


9

Per aggiungere ciò che hanno detto le altre persone, sono chiamati come-pattern (in ML la sintassi usa la parola chiave "as") e sono descritti nella sezione del Rapporto Haskell sui pattern .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.