0

Я имею дело с очень длинными списками и большими деревьями.
Иногда я нашел бы эту ошибку:Как справиться с этой ошибкой?

surgery a;; 
Characters 8-9: 
    surgery a;; 
     ^
Error: This expression has type int t/1044 
     but an expression was expected of type 'a t/1810 
# type 'a t = | Leaf of ('a -> 'a -> int) 
      | Node of 'a * 'a t * 'a t * ('a -> 'a -> int) 

я не уверен, о том, какой тип является то, что такая ошибка, но я предполагаю, что это какая-то переполнение. Тип соответствует правильно, но после обратного слэша, следующего за типом, есть большие числа. В этом случае 1044 и 1810.
На этот раз я запустил код до surgery a. Если я убью текущий верхний уровень и начну, начнется surgery a.

Мои вопросы:
1. Что это за ошибка?
2. Когда и как это происходит?
3. Почему перезапуск его с нового верхнего уровня заставит его работать?
4. Как мне с этим бороться?

ответ

7

Это ошибка типа, а не ошибка времени выполнения. Он ничего не «стоит» и никоим образом не связан с размером структур, которые у вас есть в памяти.

Это происходит, если вы не слишком осторожны в верхнем лепестке и смешиваете два разных типа с с таким же именем. Сравните:

type t = int;; 
let f (x : t) =();; 
type u = bool;; 
let g (y : u) = f y;; 
       ^
    Error: This expression has type u = bool 
     but an expression was expected of type t = int 

с

type t = int;; 
let f (x : t) =();; 
type t = bool;; 
let g (y : t) = f y;; 
       ^
    Error: This expression has type t/1047 = bool 
     but an expression was expected of type t/1044 = int 

Это точно такая же опечатка происходит в обоих случаях: вы смешиваться разные типы. Но во втором случае оба имеют одно и то же имя t. Тип-система пытается быть полезной и рассказывает о уникальных целых числах, которые она внутренне назначает именам, чтобы убедиться, что они действительно уникальны во всей программе.

Такая ошибка не может произойти за пределами верхнего уровня (при компиляции программы обычным способом), так как невозможно определить два типа с тем же именем на одном и том же пути.

Как это исправить: если вы переопределите тип с новым определением, не эквивалентным предыдущему, вы должны быть осторожны, чтобы также переопределить операции над этим предыдущим типом, ранее записанные в верхнем уровне. Действительно, они все еще печатаются как ожидающие старый тип, и использование их с новым типом приведет к таким ошибкам.

+0

Это новое? Я этого раньше не видел. –

+0

@ gasche: Спасибо за объяснение. Это должно быть проблемой. – octref

Смежные вопросы