这听起来微不足道,但我不知道我应该做什么。
以下是我的类型定义:
data CDeq q a = Shallow (q a)
| Deep{ hq ⦂ q a
, susp ⦂ CDeq q (q a)
, tq ⦂ q a }
我希望它有一个 Show
实例。
由于 GHC 不允许在这里派生
,我只是尝试自己编写一个:
instance (Show a, Show ????) => Show (CDeq q a) where
....
但是我被卡住了。
我不知道如何在 Haskell 中表示对于所有类型 v,(q v) 都可以显示
。
我不能简单地执行以下操作:
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
...
您可以使用它为 CDeq q a
编写一个 show 实例。
instance (Show a, Show1 q) => Show (CDeq q a) where
....
当您在 q x
上使用 show
或 showsPrec
时,您将使用 show1
或showsPrec1
.
如果您使用这些,您还应该提供 CDeq q
的实例。
instance (Show1 q) => Show1 (CDeq q) where
showsPrec1 = showsPrec
关于haskell - 如何在 Haskell 中的约束中应用通配符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31887204/