Вы правы, так как GHC не поддерживает полиморфные виды, он будет делать вид по умолчанию *
.
Однако, используя расширение KindSignatures
, вы можете явно аннотировать объявление данных определенным видом:
{-# LANGUAGE KindSignatures #-}
data Const (a :: * -> *) = Const Integer
Или, если ваш поклонник GADT s:
{-# LANGUAGE GADTs #-}
data Const :: (* -> *) -> * where
Const :: Integer -> Const a
Теперь вы можете написать:
x :: Const Maybe
x = Const 2
Я только что скомпилировал оригинальную программу с экспериментальным Utrecht Haskell Compiler (UHC).
UHC на самом деле не компилирует никаких реальных программ, но поддерживает полиморфизм! Его интересно увидеть, как это сделать:
-- kind of data type:
Const :: forall a . a -> *
-- type of constructor:
Const :: Integer -> forall* a . forall b(a) . Const b