下面的例子是我现实生活中问题的简化版本。它似乎在某种程度上类似于从 DataKinds 约束的存在类型中检索信息 https://stackoverflow.com/questions/24387865/retreiving-information-from-datakinds-constrained-existential-types,但我无法完全得到我正在寻找的答案。
假设我们有一个有限的、提升的 DataKindK
有类型A
and B
,以及多类Proxy
数据类型,生成类型为 * 的术语。
{-# LANGUAGE DataKinds, PolyKinds, GADTs, FlexibleInstances, FlexibleContexts #-}
data K = A | B
data Proxy :: k -> * where Proxy :: Proxy k
现在我想写Show
-每种类型的实例Proxy a
where a
是善良的K
,这恰好是两个:
instance Show (Proxy A) where show Proxy = "A"
instance Show (Proxy B) where show Proxy = "B"
但要使用Show
-实例,我必须明确提供上下文,即使类型仅限于K
:
test :: Show (Proxy a) => Proxy (a :: K) -> String
test p = show p
我的目标是摆脱类型类约束。这可能看起来不重要,但在我的实际应用中,这具有重大意义。
我也可以定义一个单一的,但更通用的Show
-像这样的例子:
instance Show (Proxy (a :: K)) where show p = "?"
这实际上允许我放弃约束,但新的问题是区分这两种类型A
and B
.
那么,有没有办法既能吃到蛋糕,又能拥有它呢?也就是说,不必在类型中提供类型类约束test
(不过,类型注释很好),并且仍然有两个不同的show
实现(例如通过以某种方式区分类型)?
实际上,如果我可以简单地将各个类型关联起来,那么删除整个类型类也是可以的(A
, B
)及其具体值(此处:"A"
, "B"
)在我只有类型信息的上下文中。不过,我不知道该怎么做。
我将非常感谢您提供的任何见解。