Я хотел бы сравнить производительность двух эвристик для игрового ИИ, над которым я работаю. Один обрабатывает элементы в порядке FIFO; другой в порядке LIFO.Извлечение общего интерфейса для стеков и очередей
В порядке вещей, код использует Queue
для обработки элемента в порядке FIFO. В ООП у меня был бы интерфейс Bag
, реализованный как Stack
, так и Queue
, и я бы использовал Bag.push
и Bag.take
для взаимодействия со структурой. Тогда я бы присвоил результат Stack.create()
или Queue.create()
переменной типа Bag
, в зависимости от значения флага командной строки, например.
Я знаю, как копировать подобное поведение в OCaml, используя абстрактные классы и ограничивающие типы с помощью :>
. Однако я полагаю, что может быть более чистый способ сделать это, что не потребует писать классы обертки вокруг Queue
и Stack
.
Я пытался что-то вроде
module type Bag =
sig
type 'a t
exception Empty
val create : unit -> 'a t
val push : 'a -> 'a t -> unit
val iter : ('a -> unit) -> 'a t -> unit
end
module BagWrapper (B : Bag) =
struct
type 'a t = 'a B.t
let create() = B.create()
let push a b = B.push a b
let iter a b = B.iter a b
end
module QueueBag = BagWrapper(Queue)
module StackBag = BagWrapper(Stack)
... но я не уверен, что делать дальше. Идеи?
Спасибо, это тоже хорошо! –