Haskell - легче читать функцию шоу? (для отладки)
Я ищу функцию, такую как show, которая дает более читаемый вывод. Это, безусловно, не должно работать на всех классах. Я искал "haskell pretty print" в Google, но это, похоже, создает принтеры исходного кода компилятора. Отладка таких вещей, как следующее (новые строки, вставленные вручную для форматирования stackoverflow), сложнее!
(fromList [(Ref {name = "phi", lenRef = 4},fromList [CompNode {val = 1, ident = CNId {uid = 4,
zone = 0}, deps = []},CompNode {val = 2, ident = CNId {uid = 5, zone = 0}, deps = []},CompNode
{val = 3, ident = CNId {uid = 6, zone = 0}, deps = []},CompNode {val = 4, ident = CNId {uid = 7,
zone = 0}, deps = []}] :: Data.Vector.Vector),(Ref {name = "phi'", lenRef = 2},fromList [CompNode
{val = -1, ident = CNId {uid = 0, zone = 0}, deps = []},CompNode {val = -1, ident = CNId {uid = 1,
zone = 0}, deps = []}] :: Data.Vector.Vector),(Ref {name = "psi", lenRef = 2},fromList [CompNode
{val = -1, ident = CNId {uid = 8, zone = 0}, deps = [CompNode {val = 1, ident = CNId {uid = 4, zone
= 0}, deps = []},CompNode {val = 2, ident = CNId {uid = 5, zone = 0}, deps = []}]},CompNode {val =
-1, ident = CNId {uid = 3, zone = 0}, deps = []}] :: Data.Vector.Vector)]
изменить
ладно, я забыл, что "печать" более точно называется "показом" в haskell... есть пакет "довольно-шоу". однако, кажется, просто назовите show
, проанализируйте строку и попытайтесь вывести ее в хорошем виде. я действительно хочу что-то, что раскрывает новую структуру класса, например. class PrettyShow a where prettyShow :: a -> String
.
изменить 2
pretty-show
недостаточно хорош для моей ситуации; его выход практически не отличается. Я пишу что-то с монадой, которая отслеживает отступы; если код превратится во что-то достаточно хорошее, возможно, я опубликую его на хаке. Кроме того, я хочу написать экземпляры PrettyShow
для моих пользовательских классов, так же как в настоящее время можно писать экземпляры show
.
Ответы
Ответ 1
Функция show
на самом деле не предназначена для создания хорошо читаемого вывода. Если вы посмотрите на реализации по умолчанию из предложения deriving
и в как говорит спецификация языка, ясно, что show
и read
предназначены как форма простой сериализации. Кроме того, ожидается, что сериализованный формат будет анализироваться как источник Haskell таким образом, что (при условии, что соответствующие определения находятся в области), интерпретируя вывод show
в качестве выражения, дает значение, эквивалентное десериализации его с помощью read
.
Если вам нужен хороший отформатированный вывод, который не похож на источник Haskell, стандартный термин для него по-прежнему "довольно печатает", и нет стандартного общего способа сделать это. Там есть довольно-печатные библиотеки, которые предоставляют примитивы для создания ваших собственных принтеров-принтеров, однако, если вы немного просмотрите Hackage. Обратите внимание, что даже если они говорят о симпатичных синтаксических деревьях в компиляторе, это просто пример; любая древовидная структура должна работать так же хорошо.
В качестве быстрой альтернативы вы можете пожелать, чтобы вывод show
был, по крайней мере, более перспективным квази-исходным кодом. Это разумно и возможно, так как read
достаточно умен, чтобы игнорировать пробелы и т.д. Пакет groom
предоставляет эту функциональность, выполняя "самую тупое дело, которое может работать" : он анализирует вывод show
как источник Haskell, затем довольно печатает это. На практике это работает очень хорошо.