OCaml中的"as"关键字

Vin*_*eng 12 ocaml pattern-matching

本网站提供的OCaml教程的答案中,一些解决方案,包括用于消除列表元素的连续重复的解决方案,如下所示:

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

这条线的相关性是a :: (b:: _ as t)什么?为什么我不能把它写成a :: b :: t呢?

Jef*_*eld 13

tb :: _ as t必然b :: _.所以意义不同.如果你使用a :: b :: t你需要说的模式compress (b :: t),这是一个不那么优雅和效率稍低的模式.

  • 带有“ as”的表格使用列表的现有尾部。没有`as`的表单会从`b`和`t`列出新列表。因此,后者只需要花费一点点额外的时间,并消耗少量的额外空间。 (2认同)

小智 8

关键字as将名称绑定到模式的全部或部分.绑定后,可以使用名称而不是它所代表的模式.在您的"压缩"功能中,t绑定到模式b :: _.一旦t绑定,它就可以在后续表达式中使用,就像"compress"函数的其余部分一样.

as名称绑定从左到右发生,与大多数语言不同(C的typedef除外).此外,::似乎具有更高的优先级as.

因此,(b :: _ as t)相当于((b :: _) as t).对于那些习惯于从右到左绑定的人来说,这可能会让人感到困惑.请注意,由于上面提到的优先级,a :: (b :: _) as t将整个模式绑定a :: b :: _t.

参考: