Подтвердить что ты не робот

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.

4b9b3361

Ответ 1

Функция show на самом деле не предназначена для создания хорошо читаемого вывода. Если вы посмотрите на реализации по умолчанию из предложения deriving и в как говорит спецификация языка, ясно, что show и read предназначены как форма простой сериализации. Кроме того, ожидается, что сериализованный формат будет анализироваться как источник Haskell таким образом, что (при условии, что соответствующие определения находятся в области), интерпретируя вывод show в качестве выражения, дает значение, эквивалентное десериализации его с помощью read.

Если вам нужен хороший отформатированный вывод, который не похож на источник Haskell, стандартный термин для него по-прежнему "довольно печатает", и нет стандартного общего способа сделать это. Там есть довольно-печатные библиотеки, которые предоставляют примитивы для создания ваших собственных принтеров-принтеров, однако, если вы немного просмотрите Hackage. Обратите внимание, что даже если они говорят о симпатичных синтаксических деревьях в компиляторе, это просто пример; любая древовидная структура должна работать так же хорошо.

В качестве быстрой альтернативы вы можете пожелать, чтобы вывод show был, по крайней мере, более перспективным квази-исходным кодом. Это разумно и возможно, так как read достаточно умен, чтобы игнорировать пробелы и т.д. Пакет groom предоставляет эту функциональность, выполняя "самую тупое дело, которое может работать" : он анализирует вывод show как источник Haskell, затем довольно печатает это. На практике это работает очень хорошо.