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.
@
na tej stronie wyjaśnia to.Odpowiedzi:
Tak, to tylko cukier syntaktyczny,
@
czytany na głos jako „jak”.ps@(p:pt)
podaje nazwyps
p
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]
, tot@(Tree _ kids)
daje ci dostęp zarówno do drzewa, jak i jego dzieci.źródło
@
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
tails
funkcja z biblioteki standardowej:źródło
Chcę dodać, że
@
działa na wszystkich poziomach, co oznacza, że możesz to zrobić: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
a
jest całościąMaybe Tuple
,b
jest tylko pierwsząJust
w krotcec
id
są wartościami zawartymi odpowiednio w pierwszej i drugiejJust
krotceźródło
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 .
źródło