Самореференциальная карта OCaml - PullRequest
0 голосов
/ 01 октября 2018

Я хочу добавить кеш в простой компилятор в 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?Или есть простой способ ссылаться на родителя и заставить мою текущую структуру работать?

1 Ответ

0 голосов
/ 01 октября 2018

Определения типов, в отличие от привязок let, по умолчанию рекурсивны.Аналогично тому, как сделать рекурсивную привязку let с помощью ключевого слова rec:

let rec f = ...

, вы можете сделать определение типа нерекурсивным с помощью ключевого слова nonrec:

type nonrec t = t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...