Pattern matching &引用;作为「;OCaml中的关键字

Pattern matching &引用;作为「;OCaml中的关键字,pattern-matching,ocaml,Pattern Matching,Ocaml,在上提供的OCaml教程的答案中,一些解决方案(包括消除列表元素连续重复的解决方案)是这样写的: let rec compress = function | a :: (b :: _ as t) -> if a = b then compress t else a :: compress t | smaller -> smaller;; 这一行的相关性是什么?为什么我不能改为a::b::t?b::u中的t与b:绑定。所以意思是不同的。如果使用模式a::b::t,则需

在上提供的OCaml教程的答案中,一些解决方案(包括消除列表元素连续重复的解决方案)是这样写的:

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

这一行的相关性是什么?为什么我不能改为
a::b::t

b::u中的
t
b:
绑定。所以意思是不同的。如果使用模式
a::b::t
,则需要说
compress(b::t)
,这有点不优雅,效率也有点低。

关键字
as
将名称绑定到模式的全部或部分。
绑定后,可以使用名称代替它所代表的模式。在“compress”函数中,
t
绑定到模式
b::
。 一旦
t
被绑定,它就可以在后续表达式中使用,就像在“compress”函数的其余部分中一样

as
名称绑定从左到右进行,这与大多数语言不同(C的typedef除外)。而且,
的优先级似乎高于
as

因此,
(b::uu)as t
相当于
((b::u)as t)
。对于那些使用从右到左绑定的人来说,这可能会让人感到困惑。注意,
a::(b:)as t
将把整个模式
a::b:)
绑定到
t
,这是由于上面提到的优先级

参考:


出色的回答您能解释一下为什么效率较低吗?带有
as
的表单使用列表的现有尾部。不带
as
的表单将从
b
t
创建一个新列表。因此,后者需要一点点额外的时间和消耗少量额外的空间。