【发布时间】:2018-09-22 15:34:01
【问题描述】:
背景
我在 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
这段代码的目的是让我可以将任意类型的类型包装成单一类型(即Type)的类型(即PolyType),然后稍后反转该过程(即解包) .
问题
我想为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)的工作方式有相当的了解,但显然还不足以理解这个错误。此外,我还没有找到解决类似问题的资源。这部分是因为我不知道如何简洁地描述它,这也使得这个问题很难想出一个好的标题。
【问题讨论】:
标签: haskell types ghc type-synonyms