如何在ocaml中工作?

时间:2017-02-08 05:49:24

标签: ocaml

我正在编写一个函数,在列表的第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
         _

添加固定问题,但我不确定我完全理解正在做什么,并且想知道如何使用它。

1 个答案:

答案 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']

我没有看到在列表末尾添加值的任何问题。