我目前正在学习Haskell,而且我在完成任务时遇到了困难。
我有一个非空的二叉树,看起来像这样
data STree a = BinS (STree a) a (STree a) | LeftS (STree a) a | RightS a (STree a) | LeafS a
我现在尝试做的就是了解如何输出这棵树。
至于开始我只想输出LeafS的案例
我试过这个
instance Show (STree a) where
show (LeafS b) = show b
我只是不知道如何将这个未知类型转换为我可以输出的String。我尝试过show,print,我能想到的一切,但没有任何效果。
树稍后只会包含整数,但我必须使用类型a ...
这就是我想要的:LeafS 2~> “2” LeafS“100”〜> “100”
答案 0 :(得分:4)
并非Haskell中的每个类型都可以show
n。有些类型不能固有地显示 - 例如键入Int -> Int
- 你如何表明?但是有些类型还没有show
的实现。所以一般来说,如果你有一些你不知道的类型a
,你不能认为它可以是show
n。
为了在类型show
上使用函数a
,您需要让编译器确保类型a
的实例为Show a
。为此,您可以在实例中添加约束,如下所示:
instance Show a => Show (STree a) where
show (LeafS b) = show b
...
因为您已指定Show a =>
,所以当且仅当类型为STree a
时,编译器才知道给定类型Show
是a
类的实例。这允许编译器调用show b
并确保在所有类型都已知时,可以进行此调用。另一方面,任何试图show
STree a
实例的人都需要确保存在实例Show a
,编译器会检查并发出错误,如果是不是这样。