如何在 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
。
澄清一下,没有缩进,你在做两件事:
定义 instance Show Nat
而不在其中实现任何函数并且
正在定义一个名为 show
的无关函数。这就是为什么
Using just "show" (which I did originally) gave an "Ambiguous occurrence" error
范围内有两个 show
函数,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
。
澄清一下,没有缩进,你在做两件事:
定义
instance Show Nat
而不在其中实现任何函数并且正在定义一个名为
show
的无关函数。这就是为什么Using just "show" (which I did originally) gave an "Ambiguous occurrence" error
范围内有两个
show
函数,Haskell 规则不优先考虑其中一个。