如何在 Haskell 中显示用户定义的数据类型

How to show a user-defined data type in Haskell

所以我试图定义我自己的数据类型,它递归地表示自然数,例如:

 data Nat = Zero | Succ Nat

此函数正常工作:

 showNat :: Nat -> String
 showNat Zero = "Zero"
 showNat (Succ k) = "Succ " ++ (showNat k)

但是,我不想每次要将 Nat 输出到屏幕时都必须调用它。我试过这个:

  instance Show Nat where
  show Zero = "Zero"
  show (Succ k) = "Succ " ++ Main.show k

但它 returns 一个错误:

• No explicit implementation for
    either ‘showsPrec’ or ‘Prelude.show’
• In the instance declaration for ‘Show Nat’
|
| > instance Show Nat where   |            ^^^^^^^^

如何正确编写 'Show' 的实例?

实例化似乎过于复杂。够了:

data Nat = Zero | Succ Nat

showNat :: Nat -> String
showNat Zero = "Zero"
showNat (Succ k) = "Succ " ++ (showNat k)

instance Show Nat where
    show = showNat

或者,人们可能喜欢使用自动生成的 show 使用 deriving:

data Nat = Zero | Succ Nat deriving (Show)

在这种情况下,nats 将显示为 Succ (Succ Zero),而不是原始代码中预期的 Succ Succ Zero

澄清一下,没有缩进,你在做两件事:

  1. 定义 instance Show Nat 而不在其中实现任何函数并且

  2. 正在定义一个名为 show 的无关函数。这就是为什么

    Using just "show" (which I did originally) gave an "Ambiguous occurrence" error

    范围内有两个 show 函数,Haskell 规则不优先考虑其中一个。