2009-07-20 13 views
95

Natknąłem kawałek kodu Haskell, który wygląda tak:Co oznacza symbol "@" w odniesieniu do list w Haskell?

[email protected](p:pt) 

Czego @ symbol oznacza w tym kontekście? Nie mogę znaleźć żadnych informacji o Google (trudno niestety szukać symboli w Google) i nie mogę znaleźć funkcji w dokumentacji Prelude, więc wyobrażam sobie, że musi to być jakiś cukier syntaktyczny.

+12

Nie próbuj szukaj tego konkretnego symbolu. Wyszukaj ogólnie składnię Haskella, a następnie znajdź symbol w tej ogólnej dyskusji. Na przykład najwyższy wynik Google dla "składni Haskella": http://www.cs.utep.edu/cheon/cs3360/pages/haskell-syntax.html. Drugie wystąpienie '@' na tej stronie wyjaśnia to. –

+1

Dobrze, że wspomniałem dokładnie, jak znalazłem ten URL, @Iter. Każdy może powtórzyć proces już dziś i znaleźć odpowiedź na każdej stronie, którą znajdą. –

Odpowiedz

138

Tak, to tylko cukier syntaktyczny, z @ czytany na głos jako "jak". [email protected](p:pt) daje nazw

  1. listę: ps
  2. listy głowy: p
  3. listy za ogon: pt

Bez @, to że trzeba wybierać między (1) lub (2) :(3).

Ta składnia faktycznie działa dla dowolnego konstruktora; jeśli masz data Tree a = Tree a [Tree a], wtedy [email protected](Tree _ kids) daje dostęp do drzewa i jego dzieci.

+0

znasz nazwę tej składni? – danza

36

Symbol @ służy do podania nazwy parametru i dopasowania tego parametru do wzorca następującego po @. Nie jest charakterystyczne dla list i może być również używane z innymi strukturami danych.

Jest to użyteczne, jeśli chcesz "rozłożyć" parametr na części, a mimo to cały czas potrzebny parametr jako całość w funkcji. Jednym z przykładów, gdzie jest to sprawa jest funkcja tails ze standardowej biblioteki:

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

Aby dodać do tego, co mówili inni, są one nazywane as-wzory (w ML składnia używa słowa kluczowego " jako ") i są opisane w sekcji raportu Haskella pod numerem patterns.

11

Chcę dodać, że @ prace na wszystkich poziomach, dzięki czemu można to zrobić:

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

które następnie wytwarzają ten: ((Just 1, Just 2), Just 1, 1, 2)

Więc w zasadzie jest to sposób, aby związać wzór do wartości. Oznacza to również, że działa on z dowolnym rodzajem wzorca, a nie tylko listami, jak pokazano powyżej. Jest to bardzo przydatna informacja, ponieważ oznacza to, że można jej używać w wielu innych przypadkach.

W tym przypadku a jest cała Maybe Tuple, b to dopiero pierwszy Just w krotce i c i d są wartości zawarte w pierwszej i drugiej Just w krotce odpowiednio