Во-первых, обратите внимание, что это недопустимый код OCaml! Это может быть код с более ранней фазы языка. Чтобы сделать его действительным, замените альфа-символы на 'a
и замените Val
на Some
.
Чтобы немного расширить то, что говорит @Lee.
Это простая перепрограммируемая реализация двухсторонней очереди (или deque), например, то, что вы бы кодировали на языке с обычными указателями (например, C).
Есть только несколько конкретных идей, которые я могу видеть, кроме того, что ссылки остаются прямыми.
На каждом конце дека есть заголовок (то, что @Lee называет часовым). Таким образом, пустой объект имеет два узла. Из-за двухсторонней связи каждый узел указывает на другой. (Это, вероятно, рекурсия, о которой вы говорите.)
Поскольку OCaml строго типизирован, все узлы должны быть одного типа, даже заголовки в конце. Поскольку заголовки не имеют в них значения, вам нужно использовать значение 'a option
. Другими словами, вам нужно разрешить узлы без значения в них.
Абонент put_between
должен поставлять два соседних узла, но они могут поставляться в любом порядке.
Код использует «физическое равенство» (==
) для проверки идентичности узлов. Это опасно для OCaml, но здесь это правильно. Переменные значения можно сравнить с ==
с более или менее результатом, который вы ожидаете от сравнения указателей на императивном языке.
Одной из причин изучения OCaml является изучение функционального программирования. Этот код не подходит для этого, поскольку (как я уже сказал) это изменчивый. Вы можете увидеть некоторые фактические функциональные реализации deque в главе 5 Chris Okasaki's PhD thesis. (Вы также можете купить свою книгу, которая является многолетним фаворитом.)
Это похоже на двусвязный список с двумя узлами. Два типа записей не являются взаимно рекурсивными, хотя 'elem' является рекурсивным, но не ссылается на' queue'. – Lee