Haskell - определение вида в объявлении данных

В этом объявлении

data Const a = Const Integer

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

7
задан GS - Apologise to Monica 18 October 2010 в 13:57
поделиться

1 ответ

Вы правы, так как 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
13
ответ дан 6 December 2019 в 19:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: