以下示例是我现实生活中问题的简化版本。它似乎在某种程度上类似于 从DataKinds约束的存在类型中检索信息,但我无法完全获得我正在寻找的答案。
假设我们有一个有限的升级数据类型K,其中包含类型A和B,并且有一个多类型的Proxy数据类型来生成类型为*的项。
现在我想为每种类型
这实际上允许我删除约束条件,但新问题是区分两种类型
那么,有没有一种方法既不必在
实际上,如果我能够简单地将相应的类型(
非常感谢提供任何见解。
假设我们有一个有限的升级数据类型K,其中包含类型A和B,并且有一个多类型的Proxy数据类型来生成类型为*的项。
{-# LANGUAGE DataKinds, PolyKinds, GADTs, FlexibleInstances, FlexibleContexts #-}
data K = A | B
data Proxy :: k -> * where Proxy :: Proxy k
现在我想为每种类型
Proxy a
编写Show
实例,其中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
和B
。那么,有没有一种方法既不必在
test
的类型中提供类型类约束(种类注释可以),又可以有两个不同的show
实现(例如通过某种方式区分类型)?实际上,如果我能够简单地将相应的类型(
A
,B
)与它们的特定值(这里是"A"
,"B"
)关联起来,在只有类型信息的情况下,也可以放弃整个类型类。我不知道如何做到这一点。非常感谢提供任何见解。