2010-12-22 10 views
11

Studiuję trochę kodu scala i znalazłem tę metodę, która mnie oszałamia. W opisie meczu, co jest konstruktem [email protected]? jaki rodzaj wartości zawiera? kiedy wydrukowałem go nie różnił się od tail, ale jeśli zastąpię go ogonem, funkcja zwraca wynik porównania. Czy ktoś może wyjaśnić, co to jest i wskazać mi odpowiedni zasób, aby to zrozumieć? (Wiem, że mogę wyszukać w google, ale nie wiem czego szukać ..)Scala "dopasuj" pomoc

def flatMapSublists[A, B](ls: List[A])(f: (List[A]) => List[B]): List[B] = 
    ls match { 
     case Nil => Nil 
     case [email protected](_ :: tail) => f(sublist) ::: flatMapSublists(tail)(f) 
    } 
+0

'@' jest zwykle używany w adnotacjach, ale nie widzę tutaj nic podobnego ... –

Odpowiedz

28

Nazwałbym to "zjedz ciastko i niech też będzie to operator". Na każdym poziomie dopasowywania wzorca możesz nadać części nazwę (przed @) i ją dekonstruować (po znaku @). Na przykład wyobrazić chcesz dopasować przeciwko lista z 3 elementów, potrzebny jest drugi element, ale chcesz się zalogować całą listę:

something match { 
    case [email protected](_,elem,_) => log("matching:" + list); elem  
    case _ => error("not found") 
} 

Bez tej funkcji, trzeba było napisać coś podobnego

something match { 
    case List(a,elem,b) => log("matching:" + List(a,elem,b)); elem  
    case _ => error("not found") 
} 

Jak widać, musimy nazwać pierwszy i trzeci element, tylko dlatego, że potrzebujemy ich, aby uzyskać listę o tej samej strukturze po prawej stronie, która jest wzorcem. O wiele łatwiej i wyraźniej można nadać tej nazwie nazwę (list), a także elementy znajdujące się głębiej w strukturze (elem), gdy potrzebne są oba elementy po prawej stronie.

+0

Niesamowite wytłumaczenie. Dzięki!! –

8

W tym przypadku staje się podlistę nazwie zmienna dla całej listy (_ :: tail). ogon to, no cóż, ogon tej listy. Nie jestem pewien, czy istnieje tutaj odpowiednia nazwa dla "@".

Nie widzę tutaj celu subskrypcji, ponieważ można bezpośrednio odwoływać się do ls.

Nota prawna: Jestem nowy w Scala. Mam nadzieję, że mam to prawo.

+1

To samo dotyczy Haskella (i prawdopodobnie ML). – delnan

+0

Hej, dziękuję za odpowiedź. Obie odpowiedzi pomogły mi to zrozumieć. –

+10

Nazywa się to "segregatorem" w odnośniku do języka. – Debilski