OCaml相当于Haskell的@in模式匹配(又称as-pattern)

APe*_*son 8 ocaml haskell pattern-matching

在Haskell中,在模式匹配时,我可以使用@一个模式来获取整个结构.(为了便于谷歌搜索,这种结构称为as-pattern.)

例如,x:xs将列表分解为头部和尾部; 我也可以获得整个列表xxs@(x:xs).

OCaml有这样的东西吗?

Éti*_*lon 18

你可以使用as:

let f = function
| [] -> (* ... *)
| (x::xs) as l ->
  (*
   here:
   - x is the head
   - xs is the tail
   - l is the whole list
  *)
Run Code Online (Sandbox Code Playgroud)


ivg*_*ivg 13

让我用一些例子来扩展艾蒂安的答案:

let x :: xs as list = [1;2;3];;
val x : int = 1
val xs : int list = [2; 3]
val list : int list = [1; 2; 3]
Run Code Online (Sandbox Code Playgroud)

当你写的时候<pattern> as <name>,变量<name>被绑定到左边的整个模式,换句话说,范围as尽可能地向左扩展(在技术上讲, as它的优先级低于构造函数,即构造函数绑定得更紧).因此,在深度模式匹配的情况下,您可能需要使用括号来限制范围,例如,

let [x;y] as fst :: ([z] as snd) :: xs as list = [[1;2];[3]; [4]];;
val x : int = 1
val y : int = 2
val fst : int list = [1; 2]
val z : int = 3
val snd : int list = [3]
val xs : int list list = [[4]]
val list : int list list = [[1; 2]; [3]; [4]]
Run Code Online (Sandbox Code Playgroud)