在本练习中,名称与 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
?
函数式编程中名称绑定的常见用途是什么?
非常感谢。
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)