Haskell - указание вида в декларации данных - PullRequest
7 голосов
/ 07 января 2010

В этой декларации

data Const a = Const Integer

Haskell делает вывод, что Const равно * -> *. Можно ли заставить Const принимать конструктор типа вместо этого, так что это будет (* -> *) -> *? В идеале это должно быть a -> *, но полиморфных видов нет. Этот поток показывает одно решение - добавление неиспользуемого конструктора. Изменилась ли ситуация с 2002 года?

1 Ответ

13 голосов
/ 07 января 2010

Вы правы, так как 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
...