2017-02-08 6 views
0

я пишу функцию, которая вставляет целое число в п-м месте в списке, и я изначально писалКак работает в 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

Эти два бита кода имеют одинаковое значение.

Я не вижу никакой проблемы ни с одним из них.

Чтобы ответить на ваш вопрос, 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'] 

Я не вижу каких-либо проблем при добавлении значения в конец списка.