haskell - 为自定义 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
功能?
解决方案
我相信这是您想要的实例:
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) ++ "]"
请注意,您需要intercalate
从Data.List
. (这与intersperse
我在评论中提到的不同——很抱歉我匆忙选错了。)
我希望当你看到它时这是有道理的——我们只是借用这个show
实例a
来处理这个Elem a
案例。然后List
case 显示所有元素,将字符串放在", "
每个元素之间,并将整个元素括在方括号中。
证明它适用于您的示例:
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]
推荐阅读
- dart - Flutter“flutter_webview_plugin”Android后退按钮问题
- c# - Caliburn.micro 父->子和子->父交互
- python - 在请求库中发送带有标头的获取请求时遇到问题
- python - 尝试在对数类型刻度上绘制线性值集 [python]
- python - Dask dataframe - 根据分隔符将列拆分为多行
- python - 如何通过设置权重创建经过训练的 Keras 模型
- python - ImportError:无法导入名称“_get_logger”Niftynet
- python - 如何识别python中的空查询参数?
- c# - Unity升级后单元测试找不到monodevelop类
- vb.net - 如何在代码的文本框中换行?