Да, существуют другие виды. Страница Промежуточные типы описывает другие виды, используемые в GHC (включая как неупакованные типы, так и некоторые более сложные виды). Язык Ωmega принимает типы с более высоким родом к максимальному логическому расширению, допуская определяемые пользователем виды (и сортировки, и выше). На этой странице предлагается своеобразное системное расширение для GHC, которое допускает определяемые пользователем виды в Haskell, а также хороший пример того, почему они будут полезны.
В качестве краткого отрывка предположим, что вы хотели тип списка, который имел бы аннотацию на уровне типа длины списка, например:
data Zero
data Succ n
data List :: * -> * -> * where
Nil :: List a Zero
Cons :: a -> List a n -> List a (Succ n)
Предполагается, что последний аргумент типа должен быть только Zero
или Succ n
, где n
опять только Zero
или Succ n
. Короче говоря, вам нужно ввести новый вид, называемый Nat
, который содержит только два типа Zero
и Succ n
. Тогда тип данных List
может выражать, что последний аргумент не является *
, а Nat
, как
data List :: * -> Nat -> * where
Nil :: List a Zero
Cons :: a -> List a n -> List a (Succ n)
Это позволило бы программе проверки типов быть гораздо более разборчивой в том, что она принимает, а также сделало бы программирование на уровне типов намного более выразительным.