Что означает символ «@» применительно к спискам в Haskell? - PullRequest
114 голосов
/ 20 июля 2009

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

ps@(p:pt)

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

Ответы [ 4 ]

162 голосов
/ 20 июля 2009

Да, это просто синтаксический сахар, с @, читаемым вслух как «как». ps@(p:pt) дает вам имена для

  1. список: ps
  2. заголовок списка: p
  3. хвост списка: pt

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

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

39 голосов
/ 20 июля 2009

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

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

tails                   :: [a] -> [[a]]
tails []                =  [[]]
tails xxs@(_:xs)        =  xxs : tails xs
19 голосов
/ 21 июля 2014

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

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 в кортеже соответственно

8 голосов
/ 20 июля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...