Haskell 定义类型同义词(GHC)的类型同义词时出现奇怪错误 背景

Haskell 定义类型同义词(GHC)的类型同义词时出现奇怪错误 背景,haskell,types,ghc,type-synonyms,Haskell,Types,Ghc,Type Synonyms,我已经用Haskell(GHC)编写了以下代码: 此代码的目的是允许我将任意类型的类型包装为单个类型(即类型)的类型(即多类型),然后将此过程反转(即,将其展开) 问题 我想为Unwrap定义一个与以下类似的类型同义词: type UnwrapSynonym pt = Unwrap pt 但是,上述定义产生以下错误(GHC 8.4.3): 这个错误意味着什么?有什么方法可以绕过它来定义unwrapsynoym 我一直在做什么 到目前为止,我解决这个问题的方法基本上是手动将Uwrap内联到我希望

我已经用Haskell(GHC)编写了以下代码:

此代码的目的是允许我将任意类型的类型包装为单个类型(即
类型
)的类型(即
多类型
),然后将此过程反转(即,将其展开)

问题 我想为
Unwrap
定义一个与以下类似的类型同义词:

type UnwrapSynonym pt = Unwrap pt
但是,上述定义产生以下错误(GHC 8.4.3):

这个错误意味着什么?有什么方法可以绕过它来定义
unwrapsynoym

我一直在做什么 到目前为止,我解决这个问题的方法基本上是手动将
Uwrap
内联到我希望定义的任何高阶类型同义词中,但这感觉很讨厌,我希望有更好的方法

不幸的是,我对GHC的内部工作没有足够的经验,甚至不知道问题是什么,更不知道如何解决它


我相信我已经很好地理解了我正在使用的扩展(例如
TypeInType
polytypes
)是如何工作的,但显然还不足以理解这个错误。此外,我还未能找到解决类似问题的资源。这部分是因为我不知道如何简明扼要地描述它,这也使得我很难为这个问题找到一个好的标题。

这个错误非常迟钝,但我认为它试图说的是GHC已经注意到,
unwapsynomy
的类型是依赖的,
forall(pt::Type)->GetKind pt
,它希望您显式地注释依赖项:

type UnwrapSynonym pt = (Unwrap pt :: GetKind pt)
它之所以要告诉它“哪些变量依赖于哪些其他变量”,是因为在以下情况下也会出现此错误:

data Nat = Z | S Nat
data Fin :: Nat -> Type where
  FZ :: Fin (S n)
  FS :: Fin n -> Fin (S n)

type family ToNat (n :: Nat) (x :: Fin n) :: Nat where
  ToNat (S n) FZ = Z
  ToNat (S n) (FS x) = S (ToNat n x)

type ToNatAgain n x = ToNat n x -- similar error
ToNatAgain
应该对所有(n::Nat)->Fin n->Nat具有种类
,但是变量
x
的类型取决于变量
n
的类型。GHC希望对其进行显式注释,因此它告诉我哪些变量依赖于哪些其他变量,并告诉我它推断出的类型有助于实现这一点

type ToNatAgain (n :: Nat) (x :: Fin n) = ToNat n x
在您的例子中,依赖关系介于返回类型和参数类型之间。根本原因是相同的,但错误消息显然没有考虑到您的案例,因此不适合。你应该提交一份bug报告

另外,您真的需要单独的
Unwrap
GetType
?为什么不使
GetType
依赖

type family GetType (pt :: Type) :: GetKind pt where
  GetType (PolyType k t) = t

根据您的解释,考虑到(至少在视觉上)很容易推断同义词的类型,因此需要类型注释是相当麻烦的冗余。关于你的建议,我从来没有想到过我可以这样定义
GetType
(谢谢你提到这一点)。
type ToNatAgain (n :: Nat) (x :: Fin n) = ToNat n x
type family GetType (pt :: Type) :: GetKind pt where
  GetType (PolyType k t) = t