Вопрос

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

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top