Можем ли мы посмотреть частично выведенную информацию о наборе. из Ocaml toplevel / compiler для программы, которая не компилируется? - PullRequest
4 голосов
/ 26 июля 2011

Хотелось бы узнать, в Окамле, есть ли частичная информация о наборе текста. может быть нарисован некоторыми существующими функциями верхнего уровня / компилятора для программы, которая не компилируется? Позволь мне объяснить.

Хорошо известно, что в Ocaml выводимый тип можно получить с помощью файла -annot. Однако иногда у нас есть фрагмент кода, который не компилируется из-за некоторой ошибки при наборе. Выдает ошибку, экспортированную на верхний уровень, этого шаблона

"This expression has type A, but was expected type B" 

Искусственный пример будет

# let x =  
  let y = 5  in
  not y;;
    Characters 32-33:
    not y;;
        ^
Error: This expression has type int 
       but an expression was expected of type bool

Программист этого куска кода должен хорошо понимать 2-ю часть этого сообщения, т.е. "у ожидается тип bool" из-за части "не у". Тем не менее, ей / ей может быть трудно понять первую часть этого сообщения об ошибке: как это «y» подразумевает тип «int»? Таким образом, было бы интересно иметь частичный набор предполагаемых типов, прежде чем возникнут конфликты типов. Для приведенного выше примера хотелось бы, чтобы интерпретатор сказал, что первое «y» (из «let y = 5») имеет тип int, по которому я буду знать причину, по которой второе «y» (из «not y») ) относится к типу int.

Не могли бы вы сказать, предоставляется ли описанная функциональность некоторым интерпретатором / компилятором ocaml?

В общем, мой вопрос таков: может ли ocaml toplevel или его интерпретатор выдавать частично выведенные типы, которые пользователь может извлечь для более эффективного поиска источника их ошибки при печати?

Этот вопрос может не иметь смысла из-за неединственности частично выведенной аннотации типа. Однако пример примера должен показать, что, по крайней мере, для некоторых случаев и некоторых частично выведенных типов его использование.

Спасибо за ваши идеи.

1 Ответ

6 голосов
/ 26 июля 2011

Примечания типа, сгенерированные переключателем -annot, доступны, даже если программа не компилировалась. Вы увидите типы для выражений, через которые прошел компилятор, и некоторые из них могут быть неполными. Это не говорит вам о причинах, по которым компилятор выводит типы, но говорит о том, как далеко зашел компилятор, и позволяет вам исследовать, что он выводит.

Например, с этим исходным кодом:

let x = [(let y = 5 in not y); true];;
  • x имеет тип _a list (компилятор не успел выяснить _a).
  • y имеет тип int.
  • not имеет тип bool -> bool.
  • Сообщение об ошибке состоит в том, что второе вхождение y имеет тип int (и мы видели, где оно было выведено), но контекст ожидает тип bool (и мы можем видеть это, так как not - это функция, тип аргумента которой bool).

Я не знаю, как увидеть эти типы с верхнего уровня, но если у вас есть исходный файл с вашим кодом, вы можете запустить ocamlc -c -annot, открыть исходный код в подходящем редакторе (например, как Emacs) и просмотрите выведенные типы независимо от того, была ли успешной компиляция.

...