Eu me deparei com um pedaço de código Haskell que se parece com isso:
ps@(p:pt)
O que o @
símbolo significa neste contexto? Parece que não consigo encontrar nenhuma informação no Google (infelizmente é difícil procurar símbolos no Google) e não consigo encontrar a função na documentação do Prelude, então imagino que deva ser algum tipo de açúcar sintático.
@
dessa página explica isso.Respostas:
Sim, é apenas açúcar sintático, com
@
lido em voz alta como "como".ps@(p:pt)
dá-lhe nomes paraps
p
pt
Sem o
@
, você teria que escolher entre (1) ou (2) :( 3).Essa sintaxe realmente funciona para qualquer construtor; se tiver
data Tree a = Tree a [Tree a]
, entãot@(Tree _ kids)
você terá acesso à árvore e a seus filhos.fonte
O
@
símbolo é usado para dar um nome a um parâmetro e corresponder esse parâmetro a um padrão que segue o@
. Não é específico para listas e também pode ser usado com outras estruturas de dados.Isso é útil se você quiser "decompor" um parâmetro em suas partes enquanto ainda precisar do parâmetro como um todo em algum lugar da sua função. Um exemplo em que esse é o caso é a
tails
função da biblioteca padrão:fonte
Quero acrescentar que
@
funciona em todos os níveis, o que significa que você pode fazer isso:O que produzirá isso:
((Just 1, Just 2), Just 1, 1, 2)
Então, basicamente, é uma maneira de vincular um padrão a um valor. Isso também significa que ele funciona com qualquer tipo de padrão, não apenas com listas, como demonstrado acima. É uma coisa muito útil para saber, pois significa que você pode usá-lo em muitos outros casos.
Nesse caso,
a
é o inteiroMaybe Tuple
,b
é apenas o primeiroJust
na tuplac
ed
são os valores contidos no primeiro eJust
no segundo na tupla, respectivamentefonte
Para adicionar o que as outras pessoas disseram, elas são chamadas de padrões (no ML, a sintaxe usa a palavra-chave "como") e são descritas na seção do Relatório Haskell sobre padrões .
fonte