Справочная информация
Я написал следующий код на Haskell (GHC):
{-# LANGUAGE
NoImplicitPrelude,
TypeInType, PolyKinds, DataKinds,
ScopedTypeVariables,
TypeFamilies
#-}
import Data.Kind(Type)
data PolyType k (t :: k)
type Wrap (t :: k) = PolyType k t
type Unwrap pt = (GetType pt :: GetKind pt)
type family GetType (pt :: Type) :: k where
GetType (PolyType k t) = t
type family GetKind (pt :: Type) :: Type where
GetKind (PolyType k t) = k
Цель этого кода - позволить мне обернуть тип произвольного вида втип (а именно PolyType
) одного вида (а именно Type
), а затем позже обратный процесс (то есть распаковка).
Проблема
Я хотел бы определить синоним типадля Unwrap
сродни следующему:
type UnwrapSynonym pt = Unwrap pt
Однако приведенное выше определение приводит к следующей ошибке (GHC 8.4.3):
* Invalid declaration for `UnwrapSynonym'; you must explicitly
declare which variables are dependent on which others.
Inferred variable kinds: pt :: *
* In the type synonym declaration for `UnwrapSynonym'
Что означает эта ошибка?Есть ли способ, которым я могу обойти это, чтобы определить UnwrapSynonym
?
Что я делал
Мой подход к этой проблеме до сих пор состоит в том, чтобы по существу вручную включить Uwrap
влюбые синонимы типа высшего порядка, которые я хотел бы определить, но это кажется странным, и я надеюсь, что есть лучший способ.
К сожалению, я недостаточно опытен во внутренней работе GHC, даже понимаю, в чем именно проблема, и гораздо меньше разбираюсь, как ее решить.
Полагаю, у меня есть приличное понимание того, как работают используемые мной расширения (например, TypeInType
и PolyKinds
), но, по-видимому, оно недостаточно глубокое, чтобы понять эту ошибку.Кроме того, мне не удалось найти ресурсы, которые решают аналогичную проблему.Отчасти это объясняется тем, что я не знаю, как кратко описать это, что также затруднило придумывание хорошего названия для этого вопроса.