2013-02-01 1 views
1

Настоящий основной вопрос здесь: Я новичок в Ocaml, и у меня возникают проблемы с управлением списками. Я читал http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html, и я, к сожалению, все еще смущен .... Я новичок в функциональном программировании.Списки управления Ocaml

Если у меня есть, скажем, следующую функцию:

let stoverfl list1 list2 list3 = 
     match list1 with 
     |[]->None 
     |h::list1 -> (*what I want to do goes in here*) 

Я хочу взглянуть на первые элементы list2 и List3, сравнить их, и если они равны, добавьте первый элемент от list3 до list2, иначе не изменяйте списки. Сейчас я не уверен в проверке ошибок (т. Е. Проверяет, есть ли в списке хотя бы один элемент и т. Д.).

Моя попытка:

h::list1 -> let cmp1 = hd list2 (*this should return the first elemnt of list2??*) 
      let cmp2 = hd list3 
      if(cmp1=cmp2) then 
       let updlist2 = concat list2 hd list3 
       let updlist3 = hd list3 
       (*pass updlist2 and updlist3 instead of list2 and list3 to next function*) 
      else 
       (*do nothing; pass list2 and list3 as normal*) 

Я чувствую, что я делаю все это неправильно ... любые советы будут оценены! Спасибо.

ответ

1

Вы говорите, что хотите добавить первый элемент от list3 в list2. Когда функциональный программист говорит что-то вроде этого, это значит, что они хотят построить новый список, как описано. Вы не можете изменять list2 - списки неизменяемы, и имена постоянно привязаны к одному значению. На самом деле, похоже, вы хотите построить два новых списка. Один из них имеет первый элемент list2 спереди list3. Остальная часть - list2 (все, кроме первого элемента).

Предполагая, что это то, что вы имеете в виду, и если вы не волнуетесь ли списки пусты, то вот один из способов, чтобы получить эти значения:

let updlist2 = List.tl list2 in 
let updlist3 = (List.hd list2) :: list3 

Это на самом деле очень близко к тому, что вы написали.

Однако, интересно, что вы собираетесь делать с этими значениями далее. Если вы хотите передать их другой функции, было бы более обычным иметь let s снаружиif. В качестве примера, вот код, который вызывает функцию g либо список, либо в хвосте списка, в зависимости от первого элемента списка:

let arg_for_g = 
    match the_list with 
    | [] -> [] (* No tail of the list *) 
    | head :: tail -> if head = 3 then tail else the_list 
in 
    g arg_for_g 

Если вы кладете let S внутри if, вам нужно будет ввести два разных вызова в следующую функцию. Это может быть хорошо, это зависит от того, что вы собираетесь делать с вашими ценностями.

(В качестве примечания, вы должны беспокоиться о том, что списки пусты! Если вы используете match заявление вы можете обнаружить, что случай довольно легко.)

Смежные вопросы