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