Довольно печатать список вертикально в haskell в интерактивной сессии
В сеансе 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 ответа
Явор Дятчки 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
Одним из решений этой проблемы является:
Prelude> mapM_ putStrLn toprint
1111111111
2222222222
3333333333
4444444444
5555555555
6666666666
но я был бы более удовлетворен использованием надлежащей красивой библиотеки печати, где у меня было бы больше гибкости, чем просто переводы строк для каждой записи.