В самой статье есть как минимум два примера:
«1. Введение» гласит: «например, мы могли бы обеспечить [во время компиляции], что предполагаемое красно-черное дерево действительно обладает красно-черным свойством».
"2.1 Содействие типам данных" обсуждает индексированные по длине векторы (то есть векторы с ошибками индексации вне границ во время компиляции).
Вы также можете взглянуть на более раннюю работу в этом направлении, например, Библиотека HList для типобезопасных гетерогенных списков и расширяемых коллекций. Олег Киселев имеет много связанных работ. Вы также можете прочитать работы по программированию с зависимыми типами. http://www.seas.upenn.edu/~sweirich/ssgip/main.pdf содержит вводные примеры для вычислений на уровне типов в Agda, но они также могут быть применены к Haskell.
Грубо говоря, идея в том, что head
для списков задается более точным типом. Вместо
head :: List a -> a
это
head :: NotEmptyList a -> a
Последняя функция head более безопасна для типов, чем fomer: ее нельзя применять к пустым спискам, поскольку это может привести к ошибкам компилятора.
Вам нужны вычисления на уровне типов для выражения типов, таких как NotEmptyList. Классы типов с функциональными зависимостями, GAGT и (индексированные) семейства типов уже предоставляют слабые формы вычислений на уровне типов для haskell. Работа, которую вы упомянули, только развивает эту тему.
См. http://www.haskell.org/haskellwiki/Non-empty_list для реализации, использующей только классы типов Haskell98.