Есть типы. Типом считается выражение вида:
1. t
2. (T1) -> (T2)
где t - type variable, T1 и T2 - любые типы. Скобки можно опускать, если выражение не становится двусмысленным. Операция -> считается правоассоциативной. Тип (a -> b) означает функцию, преобразующую экземпляры типа a в экземпляры типа b. Функции нескольких аргументов записываются, так (пусть нам нужно записать функцию двух аргументов f(A,B), где A имеет тип a, B имеет тип b, а результат имеет тип c):
a -> (b -> c),
или a -> b -> c.
Как проще всего проверить эквивалентность типов? Типы считаются эквивалентными, если один тип можно получить из другого путём переобозначения type variables, и наоборот. Например, типы (a -> b -> a) и (b -> a -> b) - эквивалентны. Я подозреваю, что можно придумать преобразование, которое бы приводило любой тип к некоторой нормальной форме. Если нормальные формы совпадают, то типы эквиваленты. Так ли это?
Как проще всего проверить приводимость типов? Тип a считаются приводимым к типу b, если экземпляр типа a является экземпляром типа b. Например, типы (a -> b -> a), (a -> Int), (a -> a), ((a -> b) -> (b -> a)) приводим к типу (a -> b).
Подозреваю, что эти задачи должны просто решаться с помощью теории графов.
Ответ на:
комментарий
от karma
Ответ на:
комментарий
от ival
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Что такое «денотационная семантика»? (2024)
- Форум Мы нашли очередную порцию глюков в Linux Kernel (2016)
- Форум Два подхода к контекстам (2014)
- Форум приведение типов (2016)
- Форум Тип контроллера (2012)
- Форум С++ Типы (2013)
- Форум Типы файлов (2020)
- Форум типы данных (2020)
- Форум Типы коллекций (2020)
- Форум типа пасхалка? (2014)