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

时间:2017-11-13 17:13:13

标签: haskell show user-defined-types

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

To create struct function passed to udf has to return Product type (Tuple* or case class), not Row.

此功能正常工作:

 data Nat = Zero | Succ Nat

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

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

但它返回错误:

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

如何正确编写“显示”的实例?

2 个答案:

答案 0 :(得分:4)

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

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)

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

答案 1 :(得分:1)

只是为了澄清,没有缩进,你做了两件事:

  1. 定义instance Show Nat而不实施其中的任何功能

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

      

    仅使用“show”(我最初做过)会出现“不明确的错误”

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