如何在Haskell约束中应用通配符?

听起来很琐碎,但我找不到我应该做的事。

以下是我的类型定义:

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)
Cirdec

还有一类Show1Prelude.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
    ....

您将在showshowsPrec使用的地方q x将改用show1showsPrec1

如果使用这些,还应该提供的实例CDeq q

instance (Show1 q) => Show1 (CDeq q) where
    showsPrec1 = showsPrec

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章