模式匹配中“as”的范围

hex*_*ark 2 ocaml pattern-matching

给定一个从列表中删除连续重复项的函数

let rec compress l =
  match l with
  | [] -> []
  | [x] -> [x]
  | x :: (y :: _ as t) -> if x = y then compress t else x :: compress t;;
Run Code Online (Sandbox Code Playgroud)

产生正确的结果

compress ["a"; "a";"b";"c";"c"] ;;
- : string list = ["a"; "b"; "c"]
Run Code Online (Sandbox Code Playgroud)

但如果x :: (y :: _ as t)我改为x :: (y :: t),那么我会得到不正确的结果

compress ["a"; "a";"b";"c";"c"] ;;
- : string list = ["b"; "c"]
Run Code Online (Sandbox Code Playgroud)

这里发生了什么 ?我无法理解声明如何_ as t改变函数的输出。直觉上,我认为它们是等价的陈述(:: _ as t:: t),但看起来它们不是。

有人可以详细说明一下吗?

ivg*_*ivg 7

它们不等价,因为as尽可能向左延伸,所以

x :: (y :: ys as t)
Run Code Online (Sandbox Code Playgroud)

该变量不仅t限于y::ysys