Що означає символ "@" стосовно посилань на списки в Haskell?


127

Я натрапив на фрагмент коду Haskell, який виглядає приблизно так:

ps@(p:pt)

Що означає @символ у цьому контексті? Я не можу знайти будь-яку інформацію в Google (на жаль, важко шукати символи в Google), і я не можу знайти цю функцію в документації Prelude, тому я думаю, що натомість це повинен бути якийсь синтаксичний цукор.


14
Не намагайтеся шукати конкретний символ. Шукайте синтаксис Haskell загалом, а потім знайдіть символ у цій загальній дискусії. Наприклад, найкращий результат Google для синтаксису Haskell: cs.utep.edu/cheon/cs3360/pages/haskell-syntax.html . Друге виникнення @на цій сторінці пояснює це.
Роб Кеннеді

1
Добре, що я точно згадав, як знайшов цю URL-адресу @Iter. Сьогодні кожен може повторити процес та знайти відповідь на будь-якій сторінці.
Роб Кеннеді

Відповіді:


179

Так, це просто синтаксичний цукор, з @читанням вголос "як". ps@(p:pt)дає вам імена для

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

Без цього @вам потрібно буде вибрати між (1) або (2) :( 3).

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


3
чи знаєте ви назву цього синтаксису?
данза

7
Це називається "як-зразок"
adamo

41

@Символ використовується для обох дати ім'я параметра і відповідати цим параметром від шаблону , який слідує за @. Він не специфічний для списків, а також може використовуватися з іншими структурами даних.

Це корисно, якщо ви хочете "розкласти" параметр на його частини, все ще потребуючи параметр у цілому десь у вашій функції. Одним із прикладів цього є tailsфункція зі стандартної бібліотеки:

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

21

Я хочу додати, що @працює на всіх рівнях, тобто ви можете це зробити:

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


9

Щоб додати те, що сказали інші люди, вони називаються як-шаблони (в ML синтаксис використовує ключове слово "як") і описано в розділі звіту Haskell про зразки .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.