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

标签 haskell

这听起来微不足道,但我不知道我应该做什么。

以下是我的类型定义:

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)

最佳答案

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

您可以使用它为 CDeq q a 编写一个 show 实例。

instance (Show a, Show1 q) => Show (CDeq q a) where
    ....

当您在 q x 上使用 showshowsPrec 时,您将使用 show1showsPrec1 .

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

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

关于haskell - 如何在 Haskell 中的约束中应用通配符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31887204/

相关文章:

正则表达式使用元正则表达式以不支持它们的语言捕获命名组?

Haskell 记录更新

haskell - Haskell 中的递归分词器

algorithm - 为什么骑士不覆盖所有的 table ?

haskell - 函数组合运算符 (.) 和 fmap (<$>) 的区别

haskell - 如何在小块中禁用 Haskell 警告?

haskell - Haskell thunk 在评估方面是否可变?

haskell - 如何在不同类型上进行模式匹配?

Haskell:这个方法做了什么

haskell - 防止 Yesod 生成 client_session_key.aes 文件