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