Я наткнулся на фрагмент кода Haskell, который выглядит так:
ps@(p:pt)
Что означает @
символ в этом контексте? Кажется, я не могу найти никакой информации в Google (к сожалению, сложно искать символы в Google), и я не могу найти функцию в документации Prelude, поэтому я полагаю, что вместо этого это должен быть какой-то синтаксический сахар.
@
на этой странице объясняет это.Ответы:
Да, это просто синтаксический сахар,
@
читаемый вслух как «как».ps@(p:pt)
дает вам имена дляps
p
pt
Без символа
@
вам придется выбирать между (1) или (2) :( 3).Этот синтаксис действительно работает для любого конструктора; если да
data Tree a = Tree a [Tree a]
, тоt@(Tree _ kids)
дает вам доступ как к дереву, так и к его дочерним элементам.источник
@
Символ используется для обоих дать имя параметра и соответствовать этому параметру от шаблона , который следует за@
. Это не относится к спискам, а также может использоваться с другими структурами данных.Это полезно, если вы хотите «разложить» параметр на части, но при этом вам нужен параметр в целом где-то в вашей функции. Один из примеров, когда это так, - это
tails
функция из стандартной библиотеки:источник
Я хочу добавить, что это
@
работает на всех уровнях, то есть вы можете сделать это:Что затем произведет это:
((Just 1, Just 2), Just 1, 1, 2)
По сути, это способ привязать шаблон к значению. Это также означает, что он работает с любым типом шаблона, а не только со списками, как показано выше. Это очень полезная вещь, поскольку это означает, что вы можете использовать ее во многих других случаях.
В этом случае
a
- это всеMaybe Tuple
,b
это только первоеJust
в кортеже,c
иd
- значения, содержащиеся в первом и второмJust
в кортеже соответственно.источник
Чтобы добавить к сказанному другими, они называются как-шаблонами (в синтаксисе ML используется ключевое слово "as") и описаны в разделе отчета Haskell о шаблонах .
источник