2014-11-05 17 views
8

W odpowiedzi na tutoriale dla SML dostępnych na this site, niektóre z rozwiązań, w tym jeden dla eliminując duplikaty z elementów listy, opisana w następujący sposób:„jako” słowo kluczowe w SML

let rec compress = function 
    | a :: (b :: _ as t) -> if a = b then compress t else a :: compress t 
    | smaller -> smaller;; 

Co jest znaczenie linii a :: (b:: _ as t)? Dlaczego nie mogę zapisać tego jako a :: b :: t?

Odpowiedz

9

Numer t w b :: _ as t jest powiązany z b :: _. Więc znaczenie jest inne. Jeśli używasz wzorca a :: b :: t, musisz powiedzieć: compress (b :: t), który jest nieco mniej elegancki i trochę mniej wydajny.

5

Słowo kluczowe as wiąże nazwę z całym lub częścią wzorca. Po związaniu można użyć nazwy zamiast reprezentowanego wzoru. W funkcji "kompresji" t jest powiązany z wzorcem b :: _. Po powiązaniu t można go użyć w kolejnych wyrażeniach, tak jak w pozostałej części funkcji "compress".

as wiązanie nazwy występuje od lewej do prawej, w przeciwieństwie do większości języków (z wyjątkiem C typedef). Wydaje się również, że :: ma wyższy priorytet niż as.

Dlatego (b :: _ as t) jest odpowiednikiem ((b :: _) as t). Może to być mylące dla osób używających połączeń od prawej do lewej. Zauważ, że a :: (b :: _) as t będzie wiązał cały wzór a :: b :: _ do t, ze względu na pierwszeństwo wspomniane powyżej.

referencyjny: