Добавим в наш язык арифметических выражений типы:
int
для целых чиселfloat
для дробных- Тип функций, учитывающий количество и типы аргументов
Для начала ограничимся явно типизированным подходом: типы аргументов функций определяются явно, типы литералов определяются формой литералов (например 1
интерпретируется как int
, а 1.0
– как float
), типы выражений выводятся методом синтеза типов. Также разрешим неявное преобразование int
к float
(но не наоборот!)
Упражнение 1
Добавьте синтаксические формы в грамматику языка, позволяющие указание типов. Предлагается использовать символ :
после имени аргумента для указания типа, напр. sum(x:int, y:int) = x+y
. Тип результата функции определяется типом выражения в правой части.
Упражнение 2
Опишите операционную семантику системы типов. Операционная семантика вывода типов рассмотрена в лекции 2 курса “функциональное и логическое программирование”.
Упражнение 3
Реализуйте проверку типов на основе определённой в упражнении 2 операционной семантики.
Упражнение 4 (**)
Добавьте вывод типов аргументов функции в месте вызова на основе алгоритма унификации.