В этом объявлении
data Const a = Const Integer
Haskell выводит это Const
* -> *
. Действительно ли возможно сделать Const
возьмите конструктора типа вместо этого, таким образом, это будет (* -> *) -> *
? Идеально, это должно быть a -> *
, но нет никаких полиморфных видов. Этот поток показывает одно решение - добавление неиспользованного конструктора. Ситуация изменилась с 2002?
Вы правы, так как GHC не поддерживает полиморфные типы, он будет делать kind по умолчанию для *
.
Однако, используя расширение KindSignatures
, вы можете явно аннотировать декларацию данных определенным видом:
{-# LANGUAGE KindSignatures #-}
data Const (a :: * -> *) = Const Integer
Или, если вы являетесь поклонником GADTs:
{-# 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