
On 22 April 2012 19:55, TP
On Sunday 22 April 2012 19:37:19 Ivan Lazar Miljenovic wrote:
Is there any particular reason you're *not* using the defaults?
This is a good question which I have asked myself. I have searched about the topic, and found that:
http://blog.romanandreg.com/post/13545420287/haskells-show-and-pretty- printing-bad-practice
So, according to this address, Show implementation should be used with Read so as to have show.read equal to identity: this is the only "good practice requirement".
In my case, I use Show to print mathematical expressions, but it is not strictly pretty printing (not over several lines as in classical Computer Algebra Sytems). Why not using my own Show implementation to do that?
For exactly the same reason you're discovering: Show/Read exist for debugging. Show and Read are meant to produce/read valid Haskell code (modulo [qualified] imports) so that you can work out what code is going wrong (and coincidentally used as a quick`n`dirty serialisation method). The term "pretty-printing" is meant in regards to producing _human-readable_ versions of your data (though the pretty-printing libraries can also be used to produce code formatted for some other tool to parse, etc.). Show/Read happen to be auto-derivable classes that implement one such form of pretty-printing (i.e. "printing" values that look like the actual source code that represents them). Let me provide you with a personal anecdote: when I took over maintaining the graphviz library, it was still using the Show class for printing (but a proper parser library for parsing), and it was working with the limited functionality it had. However, whenever I tried to do something new, I found problems: * Existing Show instances meant that it was very difficult to extend what the library could represent and then print properly. * As you've found, it can then be a PITA to debug because you have no idea what the internal values actually are. In the end, I eventually wrote a custom pretty-printing class (the existing pretty-printing classes had instances that didn't suit, just like Show) and it's worked a lot better since. The only time it's valid to override the default Show/Read instances is when the constructors aren't exported (e.g. Data.Map), but even then it should be valid Haskell (if you ignore imports, etc.). So leave Show/Read as they are, and write a custom function[s] that does the actual pretty-printing you want. -- Ivan Lazar Miljenovic Ivan.Miljenovic@gmail.com http://IvanMiljenovic.wordpress.com