Я хочу добавить кеш в простой компилятор в OCaml.Я создал более простой вариант кода, который у меня был, который воспроизводит ту же проблему.Что мне нужно для кэша, так это возможность создавать карту с ключами A, чтобы я мог посмотреть результаты компиляции.Вот код:
module A
= struct
type ineq =
| LT
| EQ
| GT
type t =
...
module ACacheMapKey
= struct
type t = t
let compare a b =
match cmp a b with
| LT -> -1
| EQ -> 0
| GT -> 1
end
module CMap = Map.Make(ACacheMapKey)
let cache_map = CMap.empty
let cmp a b =
...
end
В модуле A type t
является рекурсивным AST-подобным типом.cmp a b
возвращает ineq
.Функция компиляции была опущена для краткости, но она просто использует кеш перед запуском вычислительно дорогого процесса.Чтобы создать карту кеша в A, мне нужен совместимый ключевой модуль.Моя попытка сделать это - ACacheMapKey
, но type t = t
не относится к родителю.Это ошибка Error: The type abbreviation t is cyclic
.Итак, есть ли лучший способ сделать кеш над A?Или есть простой способ ссылаться на родителя и заставить мою текущую структуру работать?