gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:19:11 25 4
gpt4 key购买 nike

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

以下是我的类型定义:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com