April 26th, 2009

with Cat The Cat

О типизации.

Попытался сделать то, что я сказал, что можно сделать.

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

Например, мы на каком-то этапе должны убрать все присвоения a := expr, где a и expr имеют тип record.

Вот, что получилось.

Collapse )

Получилось умеренно плохо.

Сравнение на типах не получается сделать коротко. Судя по всему, надо будет делать в квадратичном виде:
type instance AEq A A rest = ()
type instance AEq A B rest = Allow A rest
type instance AEq A C rest = Allow A rest
...
type instance AEq B A rest = Allow B rest
type instance AEq B B rest = ()
type instance AEq B C rest = Allow B rest
...
Не очень хорошо, по-моему.

Это из-за отсутствия возможности работы с функциями высшего порядка.

Мне, также, не удалось сделать обобщённое множество на типах и проверку вхождения в него конкретного типа (похоже, надо доставать многопараметрические типы классов).

Сообщения об ошибках дурацкие. ;)

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

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

Ну, посмотрим ещё. ;)