2014-11-05 29 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

参考: