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)
| 归档时间: |
|
| 查看次数: |
329 次 |
| 最近记录: |