Me he encontrado con un código de Haskell que se ve así:
ps@(p:pt)
¿Qué significa el @
símbolo en este contexto? Parece que no puedo encontrar ninguna información en Google (desafortunadamente es difícil buscar símbolos en Google), y no puedo encontrar la función en la documentación del Preludio, así que imagino que debe ser algún tipo de azúcar sintáctica.
@
en esa página lo explica.Respuestas:
Sí, es solo azúcar sintáctico, con
@
lectura en voz alta como "como".ps@(p:pt)
te da nombres paraps
p
pt
Sin el
@
, deberías elegir entre (1) o (2) :( 3).Esta sintaxis realmente funciona para cualquier constructor; si es así
data Tree a = Tree a [Tree a]
, let@(Tree _ kids)
da acceso tanto al árbol como a sus hijos.fuente
El
@
símbolo se usa para dar un nombre a un parámetro y hacer coincidir ese parámetro con un patrón que sigue al@
. No es específico de las listas y también se puede usar con otras estructuras de datos.Esto es útil si desea "descomponer" un parámetro en sus partes mientras necesita el parámetro como un todo en algún lugar de su función. Un ejemplo donde este es el caso es la
tails
función de la biblioteca estándar:fuente
Quiero agregar que
@
funciona en todos los niveles, lo que significa que puede hacer esto:Lo que luego producirá esto:
((Just 1, Just 2), Just 1, 1, 2)
Básicamente, es una forma de vincular un patrón a un valor. Esto también significa que funciona con cualquier tipo de patrón, no solo listas, como se demostró anteriormente. Es muy útil saberlo, ya que significa que puede usarlo en muchos más casos.
En este caso,
a
es el todoMaybe Tuple
,b
es solo el primeroJust
en la tupla,c
yd
son los valores contenidos en el primero y el segundoJust
en la tupla respectivamentefuente
Para agregar a lo que las otras personas han dicho, se llaman as-patterns (en ML, la sintaxis usa la palabra clave "as"), y se describen en la sección del Informe Haskell sobre patrones .
fuente