Ответ 1
Data.Typeable
- это кодирование хорошо известного подхода (см., например, Harper), к внедрению замедленной (динамической) проверки типов в статически типизированном языке - с использованием типа универсальный.
Такой тип обертывания, для которого проверка типов не будет успешной до более поздней фазы. Вместо того, чтобы отклонять программу как не типичную, компилятор передает ее для проверки выполнения.
Стиль возник в Abadi et al. и разработан для Haskell Чейни и Хинзе как оболочка для представления всех динамических типов, причем класс Typeable
появляется как часть работы SYB SPJ и Lammel.
Ссылка
- Мартин Абади, Лука Карделли, Бенджамин Пирс и Гордон Плоткин, " Динамический ввод в статически типизированном языке", ACM Transactions на языках программирования и систем (TOPLAS), 1991 г.
- Джеймс Чейни и Ральф Хинзе " Легкая реализация дженериков и динамики", Haskell '02: Материалы семинара ACM SIGPLAN 2002 года на Haskell, 2002.
- Lammel, Ralf and Jones, Simon Peyton, " Отмените свой шаблон: практический шаблон проектирования для общего программирования, TLDI '03: Материалы международного семинара ACM SIGPLAN за 2003 год по разработке и внедрению типов в языках, 2003
- Harper, 2011, Практические основы языков программирования.
Даже в текстовых книгах: динамические типы (с типизированными представлениями) являются статически типизированными языками только с одним типом, Harper ch 20:
20.4 Untypedified Uni-Typed
Нетипированное λ-исчисление может быть точно встроено в набранный язык с рекурсивными типами. Это означает, что каждый нетипизированный λ-член имеет представление как типизированное выражение таким образом, чтобы выполнение представления λ-член соответствует исполнению самого термина. Эта вложение - это не вопрос написания переводчика для λ-исчисление в ℒ {+ × ⇀μ} (что мы, конечно, могли бы сделать), но скорее, прямое представление нетипизированных λ-членов в виде типизированных выражения на языке с рекурсивными типами.
Основное наблюдение заключается в том, что нетипизированное λ-исчисление действительно, не типизированное λ-исчисление! Это не отсутствие типов, которые придают ему свою силу, а скорее только один тип, а именно рекурсивный тип
D = μt.t → t.