我正在使用GHC 7.10和singletons
包。这个库中有一个名为SomeSing的GADT,它允许您存储量化单例。它的定义如下:
data SomeSing (kproxy :: KProxy k) where
SomeSing :: Sing (a :: k) -> SomeSing ('KProxy :: KProxy k)
它很棒。我们可以用这个包装一个单例,这样只知道那种,而不是类型。
我想创建一个变体,一个类似的包装器,它允许我包装一个单例并将一个类型函数的结果应用于它:
data SomeSingWith (kproxy :: KProxy k) (f :: TyFun k n -> *) where
SomeSingWith :: Sing (a :: k) -> Apply g a -> SomeSingWith ('KProxy :: KProxy k) g
然而,我收到此错误:
Data constructor ‘SomeSingWith’ cannot be GADT-like in its *kind* arguments
SomeSingWith :: forall (k :: BOX) (g :: TyFun k * -> *) (a :: k).
Sing a -> Apply g a -> SomeSingWith 'KProxy g
In the definition of data constructor ‘SomeSingWith’
In the data declaration for ‘SomeSingWith’
这是什么意思?它可以修复,还是我在GHC中做不到的事情?
答案 0 :(得分:2)
我明白了。 TyFun
的第二个参数需要被称为*
,而不是被允许为任意类型。这是有道理的。但是,与错误相关的错误消息没有帮助。
data SomeSingWith (kproxy :: KProxy k) (f :: TyFun k * -> *) where
SomeSingWith :: Sing (a :: k) -> Apply g a -> SomeSingWith ('KProxy :: KProxy k) g