在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
?
答案 0 :(得分:11)
t
中的b :: _ as t
绑定到b :: _
。所以意义不同。如果你使用模式a :: b :: t
,你需要说compress (b :: t)
,这有点不那么优雅,而且效率会稍微低一点。
答案 1 :(得分:8)
关键字as
将名称绑定到模式的全部或部分。绑定后,可以使用名称代替其代表的模式。在你的"压缩"函数t
绑定到模式b :: _
。
绑定t
后,可以在后续表达式中使用它,就像在" compress"的其余部分中一样。功能
as
名称绑定从左到右发生,与大多数语言不同(除了C&type; typedef)。此外,::
似乎优先于as
。
因此,(b :: _ as t)
相当于((b :: _) as t)
。对于那些习惯于从右到左绑定的人来说,这可能会让人感到困惑。请注意,由于上述优先级,a :: (b :: _) as t
会将整个模式a :: b :: _
绑定到t
。
参考: