Co oznacza symbol „@” w odniesieniu do list w Haskell?


127

Natknąłem się na fragment kodu Haskella, który wygląda następująco:

ps@(p:pt)

Co ten @symbol oznacza w tym kontekście? Nie mogę znaleźć żadnych informacji w Google (niestety trudno jest znaleźć symbole w Google) i nie mogę znaleźć funkcji w dokumentacji Prelude, więc wyobrażam sobie, że zamiast tego musi to być jakiś cukier składniowy.


14
Nie próbuj szukać tego konkretnego symbolu. Wyszukaj ogólną składnię Haskella, a następnie znajdź symbol w tej ogólnej dyskusji. Na przykład najwyższy wynik Google dla „Haskell syntax”: cs.utep.edu/cheon/cs3360/pages/haskell-syntax.html . Drugie wystąpienie @na tej stronie wyjaśnia to.
Rob Kennedy

1
Dobrze, że wspomniałem dokładnie, jak znalazłem ten adres URL, @Iter. Każdy może dziś powtórzyć ten proces i znaleźć odpowiedź na dowolnej znalezionej stronie.
Rob Kennedy,

Odpowiedzi:


179

Tak, to tylko cukier syntaktyczny, @czytany na głos jako „jak”. ps@(p:pt)podaje nazwy

  1. Lista: ps
  2. nagłówek listy: p
  3. ogon listy: pt

Bez tego @musiałbyś wybrać pomiędzy (1) lub (2) :( 3).

Ta składnia faktycznie działa dla każdego konstruktora; jeśli tak data Tree a = Tree a [Tree a], to t@(Tree _ kids)daje ci dostęp zarówno do drzewa, jak i jego dzieci.


3
czy znasz nazwę tej składni?
danza,

7
Nazywa się to „wzorem”
adamo,

41

@Symbol jest używany zarówno nadać nazwę parametru i dopasować ten parametr przed wzór, który podąża @. Nie jest specyficzna dla list i może być również używana z innymi strukturami danych.

Jest to przydatne, jeśli chcesz "rozłożyć" parametr na jego części, a jednocześnie potrzebujesz parametru jako całości gdzieś w swojej funkcji. Przykładem, w którym tak jest, jest tailsfunkcja z biblioteki standardowej:

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

21

Chcę dodać, że @działa na wszystkich poziomach, co oznacza, że ​​możesz to zrobić:

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

Który następnie wyprodukuje to: ((Just 1, Just 2), Just 1, 1, 2)

Zasadniczo jest to sposób na powiązanie wzorca z wartością. Oznacza to również, że działa z dowolnym wzorcem, a nie tylko listami, jak pokazano powyżej. Jest to bardzo przydatna informacja, ponieważ oznacza to, że możesz jej używać w wielu innych przypadkach.

W tym przypadku ajest całością Maybe Tuple, bjest tylko pierwszą Justw krotce ci dsą wartościami zawartymi odpowiednio w pierwszej i drugiej Justkrotce


9

Aby dodać do tego, co powiedzieli inni, są one nazywane wzorcami (w ML składnia używa słowa kluczowego „as”) i są opisane w sekcji Raportu Haskella o wzorcach .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.