我正在编写一个函数,在列表的第n个位置插入一个整数,我最初写了
let rec insert x n l =
match l with
|[] -> [x]
| h:: t -> if n = 0 then x :: l else h :: insert x (n-1) t
当我尝试在列表末尾添加一个整数时,这会引发错误。
let rec insert x n l =
match l with
|[] -> [x]
|h :: t as l -> if n = 0 then x :: l else h :: insert x (n-1) t
_
添加固定问题,但我不确定我完全理解正在做什么,并且想知道如何使用它。
答案 0 :(得分:4)
这两位代码具有相同的含义。
我看不出任何一个问题。
要回答您的问题,as
用于为模式的子部分指定名称。模式h :: t as l
通过将h
绑定到列表t
的头部到列表的尾部并l
绑定到整个列表来匹配非空列表。
在您的示例中,l
的新绑定与原始绑定(函数参数)相同。所以代码的含义没有区别。
这是第一个版本的会话:
OCaml version 4.03.0
# let rec insert x n l =
match l with
| [] -> [x]
| h :: t -> if n = 0 then x :: l else h :: insert x (n-1) t;;
val insert : 'a -> int -> 'a list -> 'a list = <fun>
# insert 'r' 3 ['o'; 'e'];;
- : char list = ['o'; 'e'; 'r']
# insert 'r' 2 ['o'; 'e'];;
- : char list = ['o'; 'e'; 'r']
# insert 'r' 1 ['o'; 'e'];;
- : char list = ['o'; 'r'; 'e']
# insert 'r' 0 ['o'; 'e'];;
- : char list = ['r'; 'o'; 'e']
我没有看到在列表末尾添加值的任何问题。