Pattern matching &引用;作为「;OCaml中的关键字
在上提供的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,则需
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
创建一个新列表。因此,后者需要一点点额外的时间和消耗少量额外的空间。