在 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 中 show
n。某些类型无法固有地显示 - 例如输入 Int -> Int
- 你如何显示?但是有些类型还没有 show
的实现。所以一般来说,如果你有一些你一无所知的类型a
,你不能假设它可以是show
n。
为了在类型 a
上使用函数 show
,您需要要求编译器确保类型 a
具有 Show a
的实例.为此,您向实例添加一个 constraint,如下所示:
instance Show a => Show (STree a) where
show (LeafS b) = show b
...
因为您指定了 Show a =>
,编译器知道给定类型 STree a
是 Show
class 的实例当且仅当类型 a
本身就是。这允许编译器调用 show b
并确保当所有类型都已知时,此调用将成为可能。另一方面,任何试图 show
STree a
实例的人都需要确保存在一个实例 Show a
,编译器将检查它并在存在时发出错误不是这样的。
我目前正在学习 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 中 show
n。某些类型无法固有地显示 - 例如输入 Int -> Int
- 你如何显示?但是有些类型还没有 show
的实现。所以一般来说,如果你有一些你一无所知的类型a
,你不能假设它可以是show
n。
为了在类型 a
上使用函数 show
,您需要要求编译器确保类型 a
具有 Show a
的实例.为此,您向实例添加一个 constraint,如下所示:
instance Show a => Show (STree a) where
show (LeafS b) = show b
...
因为您指定了 Show a =>
,编译器知道给定类型 STree a
是 Show
class 的实例当且仅当类型 a
本身就是。这允许编译器调用 show b
并确保当所有类型都已知时,此调用将成为可能。另一方面,任何试图 show
STree a
实例的人都需要确保存在一个实例 Show a
,编译器将检查它并在存在时发出错误不是这样的。