2017-02-08 15 views
0

私は、リスト内のn番目の場所で整数を挿入し、私が最初に私は、リストの末尾に整数を追加しようとしたとき、これはエラーをスローしますocamlではどのように動作しますか?

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 
     _ 

固定問題として追加するが、私は完全にやっていると、使用できるようどのように他思っていたとして、何を理解していないです。

答えて

4

これらの2ビットのコードは同じ意味を持ちます。

いずれかの問題はありません。

質問に答えるには、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'] 

:ここ

は、最初のバージョンとのセッションです。

関連する問題