在交互式会话中的Haskell中漂亮地垂直打印列表

时间:2018-12-28 11:13:22

标签: haskell jupyter-notebook ghci pretty-print ihaskell

在ghci会话中(恰好在jupyter内核中),我想在haskell中垂直打印一个列表。 (在我的用例中,我正在查看CSV,因此此列表代表一列数据,我希望显示内容能够反映出来。)

Prelude> print ["1111111111", "2222222222", "3333333333", "4444444444", "5555555555", "6666666666"]
["1111111111","2222222222","3333333333","4444444444","5555555555","6666666666"]

我正在查看GenericPretty的文档:

http://hackage.haskell.org/package/GenericPretty

我有此数据:

import Text.PrettyPrint.GenericPretty

Prelude> toprint = ["1111111111", "2222222222", "3333333333", "4444444444", "5555555555", "6666666666"]
Prelude> print toprint -- first, show standard print
["1111111111","2222222222","3333333333","4444444444","5555555555","6666666666"]

我要打印漂亮的东西:

Prelude> pretty toprint
"[\"1111111111\",\"2222222222\",\"3333333333\",\"4444444444\",\n \"5555555555\",\"6666666666\"]"

这不太正确。您可以看到它确实添加了一个“ \ n”,但并不是在每一行之后,而且有趣的是,它在交互式会话中也没有作用。它呈现为文本而不是印刷形式。

在python中,我会这样做:

>>> from pprint import pprint as pp
>>> print(['1111111111', '2222222222', '3333333333', '4444444444', '5555555555', '6666666666'])
['1111111111', '2222222222', '3333333333', '4444444444', '5555555555', '6666666666']
>>> pp(['1111111111', '2222222222', '3333333333', '4444444444', '5555555555', '6666666666'])
['1111111111',
 '2222222222',
 '3333333333',
 '4444444444',
 '5555555555',
 '6666666666']

在我的会话中打印的由“ \ n”分隔的垂直平铺正是我要的内容。我该怎么做?

2 个答案:

答案 0 :(得分:1)

Iavor Diatchki的pretty-show软件包在以下方面做得非常好:https://hackage.haskell.org/package/pretty-show

首先,使用cabal install pretty-show安装它。然后:

Prelude> import Text.Show.Pretty
Prelude Text.Show.Pretty> putStrLn  $ ppShow ["1111111111", "2222222222", "3333333333", "4444444444", "5555555555", "6666666666"]
[ "1111111111"
, "2222222222"
, "3333333333"
, "4444444444"
, "5555555555"
, "6666666666"
]

您甚至可以指示ghci自动执行此操作,因此您不必自己致电ppShow

Prelude> import Text.Show.Pretty (ppShow, pPrint)
Prelude Text.Show.Pretty> :set -interactive-print pPrint
Prelude Text.Show.Pretty> ["1111111111", "2222222222", "3333333333", "4444444444", "5555555555", "6666666666"]
[ "1111111111"
, "2222222222"
, "3333333333"
, "4444444444"
, "5555555555"
, "6666666666"
]

您可以将相关说明放入.ghci文件中,这样,如果您愿意,它会自动发生。有关详情,请参见此博客文章:https://teh.id.au/posts/2017/02/13/interactive-print/index.html

答案 1 :(得分:0)

解决此问题的一种方法是:

Prelude> mapM_ putStrLn toprint
1111111111
2222222222
3333333333
4444444444
5555555555
6666666666

但是我会对使用适当的漂亮打印库感到满意,在该库中,我的灵活性比每条记录的换行符还要多。