GHC存在量化单身

时间:2015-11-19 11:51:30

标签: haskell ghc

我正在使用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中做不到的事情?

1 个答案:

答案 0 :(得分:2)

我明白了。 TyFun的第二个参数需要被称为*,而不是被允许为任意类型。这是有道理的。但是,与错误相关的错误消息没有帮助。

data SomeSingWith (kproxy :: KProxy k) (f :: TyFun k * -> *) where
  SomeSingWith :: Sing (a :: k) -> Apply g a -> SomeSingWith ('KProxy :: KProxy k) g