2

在 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”分隔的垂直平铺正是我正在寻找的。我该怎么做呢?

4

2 回答 2

4

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

于 2018-12-28T17:30:46.613 回答
1

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

Prelude> mapM_ putStrLn toprint
1111111111
2222222222
3333333333
4444444444
5555555555
6666666666

但我会更满意使用适当的漂亮打印库,在那里我将拥有更多的灵活性,而不仅仅是每条记录的换行符。

于 2018-12-28T11:24:09.547 回答