Модуль OCAML содержит переменные типа, которые не могут быть обобщены - PullRequest
0 голосов
/ 03 мая 2019

Код:

  let size = 10
  let getTbl = Array.init size ~f:(fun _ -> Avltree.empty )
end 

Ошибка:

Error: The type of this module,
       sig val size : int val getTbl : ('_weak1, '_weak2) Avltree.t array end,
       contains type variables that cannot be generalized

Как сообщить компилятору Ocaml, что я планирую хранить ключи и значения в виде целых чисел?

Попробовал несколько разных подходов - ни один из которых не сработал.

Ответы [ 2 ]

2 голосов
/ 03 мая 2019

Слабые переменные типа обозначают типы, которые еще не определены, обычно потому, что вы определили программную переменную и никогда не использовали ее, поэтому средство проверки типов не имеет представления о том, что содержит эта переменная. В целом это нормально, поскольку первое использование переменной будет определять ее тип. Однако, поскольку вся процедура проверки типов в OCaml ограничена областью действия модуля компиляции (т. Е. Файла), такие переменные должны быть определены до того, как вы скомпилируете свой файл.

Следовательно, вы должны либо (1) использовать переменную, (2) ограничить ее каким-либо типом, например, (let getTbl : (int, int) Avltree.t array) .. в файле реализации (.ml), либо (3) в файле mli. Вы даже можете просто создать пустой файл .mli (с тем же именем, что и у вас .ml-файл), и это автоматически скроет все переменные, определенные в вашем модуле, и включит компиляцию.

1 голос
/ 03 мая 2019

Может измениться Avltree.empty на (Avltree.empty : (int, int) Avltree.t)

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