Что означает символ "@" для ссылок на списки в Haskell?

Я столкнулся с фрагментом кода Haskell, который выглядит так:

[email protected](p:pt)

Что означает символ @ в этом контексте? Я не могу найти какую-либо информацию в Google (к сожалению, трудно найти символы в Google), и я не могу найти эту функцию в документации Prelude, поэтому я полагаю, что это должен быть какой-то синтаксический сахар.

Ответ 1

Да, это просто синтаксический сахар, с @ читать вслух как "как". [email protected](p:pt) дает вам имена для

  • список: ps
  • заголовок списка: p
  • хвост списка: pt

Без @ вам придется выбирать между (1) или (2):( 3).

Этот синтаксис действительно работает для любого конструктора; если у вас data Tree a = Tree a [Tree a], то [email protected](Tree _ kids) дает вам доступ к дереву и его дочерним элементам.

Ответ 2

Символ @ используется для присвоения имени параметру и сопоставления этого параметра с шаблоном, который следует за @. Он не специфичен для списков и может также использоваться с другими структурами данных.

Это полезно, если вы хотите "разложить" параметр на части, при этом параметр в целом должен быть где-то в вашей функции. Одним из примеров, где это имеет место, является функция tails из стандартной библиотеки:

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

Ответ 3

Я хочу добавить, что @ работает на всех уровнях, что означает, что вы можете сделать это:

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

который затем произведет это: ((Just 1, Just 2), Just 1, 1, 2)

Таким образом, в основном это способ привязать шаблон к значению. Это также означает, что он работает с любым типом шаблона, а не только с списками, как показано выше. Это очень полезно знать, поскольку это означает, что вы можете использовать его во многих других случаях.

В этом случае a - это весь Maybe Tuple, b - это только первый Just в кортеже, а c и d - значения, содержащиеся в первом и втором Just в кортеже, соответственно

Ответ 4

Чтобы добавить к тому, что говорили другие люди, они называются как-шаблоны (в ML синтаксис использует ключевое слово "как" ) и описаны в разделе отчета Haskell на шаблоны.