Параметр форсирования семейства типов должен иметь вид *

Этот простой код не компилируется

import Data.Kind
type family F (k :: Type) :: (t :: k) -> Type

Сообщение об ошибке

• Expected a type, but ‘t’ has kind ‘k’
• In the kind ‘(t :: k) -> Type’

В каком-то смысле я понимаю, что это на самом деле определяет «семейство семейств типов», но я действительно не понимаю, почему это ограничение может существовать.

type family F (k :: Type) (t :: k) :: Type

работает, но у него другая семантика, и его нельзя использовать одинаково.


person Luka Horvat    schedule 30.06.2017    source источник
comment
Разве вещи с правой стороны от :: для семейства типов не являются видами? Итак, первый (будет) говорить, что тип t имеет вид k, а второй говорит, что тип t имеет вид k?   -  person David Young    schedule 30.06.2017
comment
С TypeInType все то же самое.   -  person Luka Horvat    schedule 30.06.2017
comment
Возможно, type family F (k :: Type) :: k -> Type ближе к тому, что вы хотите?   -  person chi    schedule 30.06.2017
comment
@чи Вау, конечно. Я понятия не имею, почему я так усложнил это.   -  person Luka Horvat    schedule 30.06.2017
comment
Семейства типов не являются реальными «функциями». Семейство 2-го типа не имеет типа (k :: Type) -> (t :: k) -> Type. Фактически, у него нет типа, который в настоящее время может быть выражен в Haskell. Первое семейство типов недопустимо, поскольку (->) :: Type -> Type -> Type, но вы явно объявили t :: k и k (переменная нового типа), не унифицируется с Type. (t :: Type) -> Type будет полностью действительным (и эквивалентен типу в принятом ответе).   -  person user2407038    schedule 01.07.2017
comment
@user2407038 user2407038 Я почти уверен, что (-›) многороден.   -  person Luka Horvat    schedule 02.07.2017


Ответы (1)


Нет необходимости называть t в результирующем типе. Вы можете просто использовать

type family F (k :: Type) :: k -> Type
person chi    schedule 30.06.2017