首页 > 解决方案 > 为自定义 NestedList 类型实例化 Show typeclass

问题描述

我已经定义了以下自定义类型的任意深度列表

data NestedList a
    = Elem a
    | List [NestedList a]

我想实例化 Show 并漂亮地打印我的嵌套列表,但我不知道 show 函数应该如何查找我的类型

instance (Show a) => Show (NestedList a) where

例如,如果我们有

let a = List [List[Elem 2], Elem 1, List[Elem 1, Elem 2],
              List[List[Elem 2, Elem 3]], Elem 5]

我要show a打印

"[[2], 1, [1, 2], [[2, 3]], 5]"

如何实现该show功能?

标签: haskell

解决方案


我相信这是您想要的实例:

data NestedList a = Elem a | List [NestedList a]

instance (Show a) => Show (NestedList a) where
    show (Elem a) = show a
    show (List xs) = "[" ++ intercalate ", " (map show xs) ++ "]"

请注意,您需要intercalateData.List. (这与intersperse我在评论中提到的不同——很抱歉我匆忙选错了。)

我希望当你看到它时这是有道理的——我们只是借用这个show实例a来处理这个Elem a案例。然后Listcase 显示所有元素,将字符串放在", "每个元素之间,并将整个元素括在方括号中。

证明它适用于您的示例:

Prelude Data.List> :{
Prelude Data.List| let a = List [List[Elem 2], Elem 1, List[Elem 1, Elem 2],
Prelude Data.List|               List[List[Elem 2, Elem 3]], Elem 5]
Prelude Data.List| :}
Prelude Data.List> a
[[2], 1, [1, 2], [[2, 3]], 5]

推荐阅读