鉴于我有数据类型
data A a = A a
data B b = B b
和类型类
class C c where
f :: c a -> a
现在类 C 需要一种 * -> *
类型,所以我可以这样做
instance C A where
f (A a) = a
instance C B where
f (B b) = b
现在给出一个函数,例如:
ab :: b -> A (B b)
ab = A . B
如何为结果类型声明 C
实例?
我首先可能能够使用 TypeSynonymInstances
的类型同义词,如下所示:
type AB b = A (B b)
class C AB where
f (A (B b)) = b
特别是因为 ghci 报告了正确的类型:
*Main> :k AB
AB :: * -> *
但是,您似乎无法在实例声明中(或任何地方)使用部分应用的类型同义词。
是否有某种方法可以像构造构造函数一样构造类型 A
和 B
,或者使用其他语法来声明此类嵌套类型的实例?
最佳答案
最简单的可能是定义
newtype AB a = AB { unAB :: A (B a) }
GHC 应该能够为此派生一个 C 实例。
您还可以使用 TypeCompose为了实现这一点,
type AB = A :. B
instance C AB where
f = f . f . unO
关于haskell - 嵌套参数化类型的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7320646/