Почему Type - это тип типов со значениями? - PullRequest
5 голосов
/ 24 сентября 2019

Если я включу MagicHash, то у меня есть неснятые значения, такие как 42# с типом Int#.

Теперь, если Type - это тип типов со значениями тогда тип Int# должен быть Type, но это не потому, что Type является синонимом TYPE 'LiftedRep, тогда как тип Int# равен TYPE 'IntRep.Мы можем легко подтвердить это в ghci,

Prelude> :set -XMagicHash -XKindSignatures
Prelude> :m +Data.Kind GHC.Prim
Prelude Data.Kind GHC.Prim> :k (Int# :: Type)

<interactive>:1:2: error:
    • Expecting a lifted type, but ‘Int#’ is unlifted
    • In the type ‘(Int# :: Type)’

Так что это просто тот случай, когда мы не рассматриваем магические литералы, такие как 42#, как значения?

Ответы [ 2 ]

2 голосов
/ 25 сентября 2019

Это действительно оказалось недостатком в документации, и теперь исправлено в заголовке GHC.

Подводя итог, Type - это тип типов с поднятыми значениями, потому чтоЕсть другие значения с разными типами, например 42# :: (Int# :: TYPE 'IntRep)).

2 голосов
/ 24 сентября 2019

Просто исключите сигнатуру типа, и GHCI с радостью скажет вам:

Prelude Data.Kind GHC.Prim> :k Int#
Int# :: TYPE 'GHC.Types.IntRep

Это не поднятый Int, который соответствует тому, что мы ожидаем от имени Int#.

...