Полиморфные виды являются расширением системы типов Haskell, поддерживаемой UHC, позволяя
data A x y = A (y x)
быть введенным (kinded?) как a -> (a -> *) -> *
. Для чего они полезны?
Одним из возможных примеров использования может быть использование Conal TypeCompose для создания преобразователей монад в бесточечном стиле.
type MyT = StateT Foo :. MaybeT :. ContT Bar
(просто в качестве примера, я понятия не имею, что делать с этими foos и bars ..)
Вместо:
type MyT m = StateT Foo (MaybeT (ContT Bar m))
(это будет иметь тот же результат, кроме newtype
-wrappers)
В настоящее время вам нужно дублировать код комбинаторов для разных типов, и это расширение отменяет повторение и позволяет использовать один фрагмент кода для управления ими всеми.
Конечно, они полезны для определения функций, которые работают над конструкторами данных с произвольной аритмией!
Конкретным примером может быть функция, которая, учитывая конструктор данных с произвольной чёткостью, возвращает новый конструктор данных, который оборачивает данный конструктор в Some().
Добавление полиморфных видов к GHC
Фоном для этого вопроса может быть мотивация в целом для более выразительной системы типов .
То есть, общая причина добавления полиморфных видов в Haskell заключается в том, чтобы улучшить опыт программирования на уровне типов . В настоящее время программирование на уровне типов в Haskell осуществляется на практически нетипизированном уровне " kind ". Более богатый добрый язык упростит программирование на уровне типов в Haskell в целом.
Более конкретным примером может быть удаление (динамического) ограничения Typeable из универсальных шаблонов стиля SYB ( цитата ), а также улучшение общей поддержки универсального программирования более высокого порядка.