代码之家  ›  专栏  ›  技术社区  ›  A.M.

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

  •  2
  • A.M.  · 技术社区  · 7 年前

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

     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
    

    但它返回一个错误:

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

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

    2 回复  |  直到 7 年前
        1
  •  8
  •   anumi    7 年前

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

    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 如原规范所述。

        2
  •  1
  •   Alexey Romanov    7 年前

    只是澄清一下,没有缩进,你在做两件不同的事情:

    1. instance Show Nat 没有实现其中的任何功能

    2. 定义一个称为 show

      仅使用“show”(我最初是这样做的)会产生“含糊不清的事件”错误

      有两个 显示