2014-11-05 62 views
8

在答案的教程OCaml的可用this site,一些解決方案,包括一個用於消除列表元素的連續的重複的,被寫成這樣:「爲」關鍵字OCaml中

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

什麼是行a :: (b:: _ as t)的相關性?爲什麼我不能把它寫成a :: b :: t呢?

回答

9

中的t綁定到b :: _。所以意思是不同的。如果你使用a :: b :: t的模式,你需要說compress (b :: t),這有點不那麼優雅,效率稍差。

5

關鍵字as將名稱綁定到模式的全部或部分。綁定後,名稱可以用來代替它所代表的模式。在你的「壓縮」功能中,t綁定到b :: _的模式。 一旦t被綁定,它就可以在後續表達式中使用,就像在其他「壓縮」函數中一樣。

as與大多數語言不同,名稱綁定是從左到右發生的(除了C的typedef)。此外,::似乎具有比as更高的優先級。因此,(b :: _ as t)相當於((b :: _) as t)。這對於那些用於從右到左綁定的用戶可能會感到困惑。請注意,由於上述優先級,a :: (b :: _) as t將綁定整個模式a :: b :: _t

參考: