听起来很琐碎,但我找不到我应该做的事。
以下是我的类型定义:
data CDeq q a = Shallow (q a)
| Deep{ hq ⦂ q a
, susp ⦂ CDeq q (q a)
, tq ⦂ q a }
我希望它有一个实例Show
。
由于GHCderiving
在这里不允许,所以我只是尝试自己写一个:
instance (Show a, Show ????) => Show (CDeq q a) where
....
但是我被卡住了。
我不知道该如何for all type v, (q v) can be shown
用Haskell来表示。
我不能简单地执行以下操作:
instance (Show a, Show (q a)) => Show (CDeq q a) where
....
因为要显示CDeq q (q a)
,所以Show (q (q a))
是必需的,然后Show (q (q (q a)))
是必需的,然后再打开。
所以我想知道是否有一种语法可以表达我在那里所说的意思?
我曾经以为这forall
可能是解决方案,但这是行不通的:
instance (Show a, forall v. Show (q v)) => Show (CDeq q a)
还有一类Show1
在Prelude.Extras
表示“对于所有类型的v
,(q v)
可以证明”。
class Show1 f where
showsPrec1 :: Show a => Int -> f a -> ShowS
default showsPrec1 :: (Show (f a), Show a) => Int -> f a -> ShowS
showsPrec1 = showsPrec
...
您可以使用它为编写一个show实例CDeq q a
。
instance (Show a, Show1 q) => Show (CDeq q a) where
....
您将在show
或showsPrec
上使用或的地方q x
将改用show1
或showsPrec1
。
如果使用这些,还应该提供的实例CDeq q
。
instance (Show1 q) => Show1 (CDeq q) where
showsPrec1 = showsPrec
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句