以下示例是我现实生活问题的简化版本。它似乎在某种程度上类似于Retrieving information from DataKinds constrained existential types,但我无法完全得到我正在寻找的答案。DataKinds和类型实例
假设我们有一个有限的,晋升DataKind K
与类型A
和B
,和聚kinded Proxy
数据类型,产生与各类样的条件*。
{-# LANGUAGE DataKinds, PolyKinds, GADTs, FlexibleInstances, FlexibleContexts #-}
data K = A | B
data Proxy :: k -> * where Proxy :: Proxy k
现在我想写Show
-instances对每种类型Proxy a
其中a
是样K
,这是完全二:
instance Show (Proxy A) where show Proxy = "A"
instance Show (Proxy B) where show Proxy = "B"
但使用Show
-instance,我要明确提供上下文,即使该种类仅限于K
:
test :: Show (Proxy a) => Proxy (a :: K) -> String
test p = show p
我的目标是摆脱类型约束。这看起来可能并不重要,但在我的实际应用中,这具有重大意义。
我还可以定义一个单一的,但更普遍的Show
-instance这样的:
instance Show (Proxy (a :: K)) where show p = "?"
这实际上让我删除约束,但新的问题是两种类型A
和B
区分。
那么,有没有办法吃我的蛋糕,也有吗?也就是说,不必提供类型为test
的类型约束(种类注释很好,但是),并且仍然有两个不同的show
实现(例如通过区分类型)?
其实,这也将是好放弃整个类型的类,如果我可以简单地在各自的类型(A
,B
)与他们的特定值(在这里:"A"
,"B"
)相关联的情况下,我只是有类型信息。不过,我不知道该怎么做。
我会非常感谢任何提供的见解。
谢谢你的回答,我担心这是不可能的。我想我必须找到解决办法。 –