2017-02-08 4 views
0

Ich schreibe eine Funktion, die eine ganze Zahl an der n-ten Stelle in einer Liste eingefügt und ich schrieb zunächstWie funktioniert in 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 

würde dies einen Fehler aus, wenn ich am Ende der Liste eine ganze Zahl hinzuzufügen versucht.

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 
     _ 

wie das Problem behoben Hinzufügen aber ich bin nicht sicher, ob ich verstehen, was da tut, und frage mich, wie sonst wie verwendet werden könnten.

Antwort

4

Diese beiden Codebits haben die gleiche Bedeutung.

Ich kann kein Problem mit beiden sehen.

Um Ihre Frage zu beantworten, wird as verwendet, um einem Unterabschnitt eines Musters einen Namen zu geben. Das Muster h :: t as l stimmt mit einer nicht leeren Liste überein, indem h an den Kopf der Liste t an das Ende der Liste und l an die gesamte Liste gebunden wird.

In Ihrem Beispiel ist die neue Bindung für l die gleiche wie die ursprüngliche Bindung (der Funktionsparameter). Es gibt also keinen Unterschied in der Bedeutung des Codes.

Hier ist eine Sitzung mit der ersten Version:

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

Ich sehe nicht ein Problem mit dem Ende der Liste einen Wert hinzufügen.