在 Haskell 中显示未知类型(基本)

Showing an unknown type in Haskell (basic)

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

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

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

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

一开始我只想输出LeafS a的case

我试过了

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

我只是不知道如何将这个未知类型 a 转换为我可以输出的字符串。我试过展示、打印,我能想到的一切,但都没有用。

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

这就是我想要的:LeafS 2 ~> "2" LeafS "100" ~> "100"

并非每种类型都可以在 Haskell 中 shown。某些类型无法固有地显示 - 例如输入 Int -> Int - 你如何显示?但是有些类型还没有 show 的实现。所以一般来说,如果你有一些你一无所知的类型a,你不能假设它可以是shown。

为了在类型 a 上使用函数 show,您需要要求编译器确保类型 a 具有 Show a 的实例.为此,您向实例添加一个 constraint,如下所示:

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

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