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

时间:2017-12-05 03:31:58

标签: haskell haskell-stack

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

1 个答案:

答案 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时,编译器才知道给定类型Showa类的实例。这允许编译器调用show b并确保在所有类型都已知时,可以进行此调用。另一方面,任何试图show STree a实例的人都需要确保存在实例Show a,编译器会检查并发出错误,如果是不是这样。