так что у меня есть функция:
let rec add_rules start rules prod =
match rules with
| [] -> prod
| nonterm::lst -> if ((fst nonterm) = start)
then add_rules start (List.remove_assoc
(fst nonterm) rules) (nonterm::prod)
else if (check_sym (fst nonterm) prod)
then add_rules start (List.remove_assoc
(fst nonterm) rules) (nonterm::prod)
else add_rules start lst prod
, и он принимает элемент с именем start
, список пар с именем rules
, где (x,[y])
и x
это элемент, а y
это список, а пустой список prod
.
, не вдаваясь в подробности о специфике этой функции, я в основном хочу, чтобы он прошел список пар (rules
) и добавил некоторыеэлементы в пустой список prod
.
проблема: в первых двух операторах if / else if, мой код успешно удаляет пару, соответствующую (fst nonterm)
, и передает весь оригиналсписок (минус (fst nonterm)
) вернуться к рекурсивной функции.однако в последнем операторе else я рекурсивно перебираю список, вызывая хвост исходного списка rules
, передавая его в функцию и, следовательно, в конечном итоге не в состоянии получить доступ к этим головкам когда-либо снова.
есть ли способ избежать этого?или есть какой-нибудь способ, которым я могу пройти по списку, не избавляясь от головы каждый раз?
заранее спасибо !!!