Что означает символ "@" для ссылок на списки в 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 на шаблоны.