代码之家  ›  专栏  ›  技术社区  ›  Jan v

在Haskell(basic)中显示未知类型

  •  -1
  • Jan v  · 技术社区  · 7 年前

    我目前正在学习Haskell,在完成一项任务时遇到了困难。

    我有一个非空的二叉树,看起来像这样

    data STree a = BinS (STree a) a (STree a) | LeftS (STree a) a | RightS a (STree a) | LeafS a    
    

    我现在要做的就是理解如何输出这棵树。

    至于开始,我只想输出叶a的情况

    我试过这个

    instance Show (STree a) where
    show (LeafS b) = show b
    

    我只是不知道如何将这个未知类型a转换为可以输出的字符串。我试过表演,印刷,我能想到的一切,但都不管用。

    树稍后将只包含整数,但我必须使用类型a。。。

    这就是我想要的:叶子2 ~>"2" 树叶“100”~>"100"

    1 回复  |  直到 7 年前
        1
  •  4
  •   Fyodor Soikin    7 年前

    不是每种类型都可以 show n在哈斯克尔。某些类型无法固有显示-例如类型 Int -> Int -你是怎么表现出来的?但有些类型还没有实现 显示 . 一般来说,如果你有某种类型的 a 你对此一无所知,你不能想当然 显示 n

    为了使用该功能 显示 根据你的类型 ,您需要要求编译器确保该类型 有一个实例 Show a . 为此,您需要添加一个 限制 对于您的实例,如下所示:

    instance Show a => Show (STree a) where
        show (LeafS b) = show b
        ...
    

    因为您已指定 Show a => ,编译器知道给定的类型 STree a 是的实例 Show 当且仅当类型 它本身就是。这允许编译器调用 show b 并且确保,当所有类型都已知时,这个调用将是可能的。另一方面,任何试图 显示 的实例 应力a 需要确保存在一个实例 显示a ,编译器将对此进行检查,如果不是这样,则发出错误。