2010-06-13 3 views
63

Когда я экспериментировал с Haskell видов, и пытается получить вид ->, и это обнаружился:Haskell Weird Kinds: Вид (->) есть? ->? -> *

$ ghci 
... 
Prelude> :k (->) 
(->) :: ?? -> ? -> * 
Prelude> 

Вместо ожидаемого * -> * -> *. Что такое ?? и ?? Имеют ли они в виду конкретные типы или «переменные вида»? Или что-то другое?

+1

Этот вопрос сейчас исторический. Так как вокруг GHC 7.4, тип '(->)' теперь просто '* -> * -> *', даже если включен режим PolyKinds. –

ответ

96

Это GHC-специфические расширения системы типа Haskell. Haskell 98 Отчет specifies only a simple kind system:

... Выражения типа классифицируются в различные виды, которые принимают один из двух возможных форм:

Символ * представляет собой вид все нульарные конструкторы типа. Если k1 и k2 являются видами, то k1-> k2 - типы типов , которые относятся к типу вида k1 и возвращают тип вида k2.

GHC extends this system с формой любезных подтипов, чтобы unboxed types и разрешить функцию construtor полиморфной над видами. Вид решетки GHC поддерживает это:

   ? 
      /\ 
      /\ 
      ?? (#) 
     /\  
     * #  

Where:  * [LiftedTypeKind] means boxed type 
      # [UnliftedTypeKind] means unboxed type 
      (#) [UbxTupleKind]  means unboxed tuple 
      ?? [ArgTypeKind]  is the lub of {*, #} 
      ? [OpenTypeKind]  means any type at all 

Определено в ghc/compiler/types/Type.lhs

В частности:

> error :: forall a:?. String -> a 
> (->) :: ?? -> ? -> * 
> (\\(x::t) -> ...) 

Где в последнем примере t :: ?? (т.е. не является распакованный кортеж). Итак, чтобы процитировать GHC, «есть небольшой подтипирование на уровне уровня».

Для заинтересованных душ GHC также поддерживает типы и виды принуждения («термины на уровне типа, которые действуют как доказательство эквивалентности типов», по мере необходимости System Fc), используемые в GADT, типах новых типов и типах.

+9

Удивительно, так как это все - есть ли случаи, когда пользователю (в отличие от компилятора) может быть нужно/нужно явно использовать эти различия в штучной упаковке/распакованном виде? На поверхностном взгляде они кажутся немного утечкой абстракции некоторого внутреннего механизма вывода, используемого для оптимизации внутри компилятора? – Matt

+6

Вам будет интересно, если вы попытаетесь написать функции, которые используют типы, отличные от «*», поскольку они имеют различные ограничения на то, как вы можете создавать. –

+1

Для меня это похоже на утечку абстракции. Языки программирования связаны с тем, что разработчик должен обладать правильным уровнем абстракции. Я думаю, что это один уровень до глубины. –

Смежные вопросы