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

在Haskell中显示未知类型(基本),haskell,haskell-stack,Haskell,Haskell Stack,我目前正在学习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 我只是不知道如何将未

我目前正在学习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

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

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

为了在类型
a
上使用函数
show
,您需要要求编译器确保类型
a
具有
show a
的实例。为此,可以向实例添加约束,如下所示:

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

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

您尝试了一些东西,可能编译器会向您提供一条非常有用的错误消息,解释它为什么不起作用。非常感谢!这对我帮助很大