OCaml 中模式匹配中的名称绑定

问题描述 投票:0回答:1

在本练习中,名称与 as- 关键字绑定的作用是什么: https://ocaml.org/problems#17

# let split list n =
    let rec aux i acc = function
      | [] -> List.rev acc, []
      | h :: t as l -> if i = 0 then List.rev acc, l
                       else aux (i - 1) (h :: acc) t 
    in
      aux n [] list;;

是否允许我们在 if / else 子句中选择在函数模式匹配中使用尾部

t
还是列表
l
? 函数式编程中名称绑定的常见用途是什么? 非常感谢。

list functional-programming binding pattern-matching ocaml
1个回答
3
投票

as
关键字允许您将名称绑定到模式的较大和较小部分。在您提供的示例中:

let split list n =
  let rec aux i acc = function
  | [] -> List.rev acc, []
  | h::t as l -> if i = 0 then List.rev acc, l
                 else aux (i - 1) (h :: acc) t 
  in
  aux n [] list

l
绑定到整个列表,
h
绑定到列表的头部,
t
绑定到尾部。

如果没有

as
,你可能会写:

let split list n =
  let rec aux i acc = function
    | [] -> List.rev acc, []
    | h::t -> 
        if i = 0 then List.rev acc, (h::t)
        else aux (i - 1) (h :: acc) t 
  in
  aux n [] list

请记住,

as
在其左侧是“贪婪”的,可能需要括号来消除优先级歧义。

例如

h::h'::t as lst

整个列表绑定到

lst

如果你想绑定尾部,还想绑定列表中的第二个元素:

h::(h'::_ as tl)
© www.soinside.com 2019 - 2024. All rights reserved.