Несомненно, если вы действительно хотите, вы можете сделать много вещей. Есть два примера технического избегания рекурсии, и тогда то, что я думаю, что вы, возможно, уже на самом деле искали:
let truncate1 elt list = (* tedious iteration version *)
let list = ref list in
let r = ref [] in
while !list <> [] do
r := List.hd !list :: !r;
if List.hd !list = elt then list := [] else
list := List.tl !list
done;
List.rev !r
let truncate2 elt list = (* let's not mind how List.find does it version *)
let r = ref [] in
ignore (List.find (fun x -> r := x :: !r; x = elt) list);
List.rev !r
(* this is more what you're looking for? version *)
type 'a mutcons = { mutable head : 'a; mutable tail : 'a mutlist }
and 'a mutlist = Nil | Cons of 'a mutcons
let rec mutlist_iter f = function
| Nil ->()
| Cons k -> f k; mutlist_iter f k.tail
let rec truncate3 elt mlist =
mutlist_iter (fun k -> if k.head = elt then k.tail <- Nil) mlist
Если последние подходит изменяемый список и мутирует текущую ячейку последний из списка если он содержит данный элемент.
Трудно получить какой-либо ручек по этому вопросу. Нет никакого типа '' очередь 'в OCaml, и нет никакой причины, чтобы избежать использования рекурсии. Также нет способа сопоставить произвольную структуру с шаблоном. –
тип 'a queue is' список ref? Это, по сути, список? Существует также другой тип очереди, который представляет собой запись с изменяемой головой и хвостом: type 'queue = {mutable head:' параметр qnode; mutable tail: 'a qnode option} –