#haskell #dependent-type #data-kinds #singleton-type
#haskell #зависимый тип #типы данных #одноэлементный тип
Вопрос:
В singletons-2.6 Sigma
определяется как
data Sigma (s :: Type) :: (s ~> Type) -> Type
и GHC 8.8.4 сообщает, что его вид
> :k Sigma
Sigma :: forall s -> (s ~> *) -> *
Так что же это forall
такое в этой подписи вида?
По-видимому, это отличается от
data Sigma :: forall s. Type -> (s ~> Type) -> Type
в этом случае его вид, конечно,
Sigma :: * -> (s ~> *) -> *
Кроме того, это, похоже, отличается от
data Sigma :: f s -> (s ~> *) -> *
Мне кажется, что расширенный вид переменной s
типа в s :: Type
унифицирован с переменной вида s
в (s ~> Type) -> Type
, но происходит ли это? У меня такое чувство, что я упускаю что-то очень простое.
Я пытался найти какие-либо документы, описывающие это, но мне не повезло.
Комментарии:
1. Я не уверен, но я предполагаю, что
K :: forall s. F s -> T
это означает, чтоK
принимает один аргумент, и этоs
выводится из этого. ВместоK :: forall s -> F s -> T
этого должно означать, чтоK
принимает два аргумента и что значение первого должно совпадать с типом второго, аналогично тому, что происходит для зависимо типизированных функций на других языках.
Ответ №1:
Теперь я получил несколько идей от зависимого haskell в GHC Wiki.
Теперь мы можем передать вид конструктору типа точно так же, как мы можем передать тип конструктору данных (хотя нам все равно нужно передать синглтон вместо самого типа).
В этом объявлении Sigma
,
data Sigma (s :: Type) :: (s ~> Type) -> Type
s
in s :: Type
— это переменная вида Type
типа kind-kind, и этот вид должен быть передан явно при использовании Sigma
. И в виде подписи,
Sigma :: forall s -> (s ~> *) -> *
forall s
означает s
видимый вид. Это означает, что вам нужно передать его явно, когда вы говорите, что он виден. Вы можете прочитать это как Sigma
конструктор типа, принимающий вид s
и тип вида s ~> Type
и возвращающий тип вида Type
.
Вы не можете написать подпись этого типа непосредственно в GHC 8.8.4, но вы можете написать ее, используя StandaloneKindSignatures
GHC 8.10.1.
Обновление (2021/9/30):
Это называется видимой зависимой количественной оценкой. Вы можете найти хорошее объяснение по этому поводу в Visible dependent quantification в Haskell.