"如" OCaml中的关键字

时间:2014-11-05 23:54:43

标签: pattern-matching 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

2 个答案:

答案 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

参考: