On 22 April 2012 19:55, TP <paratribulati...@free.fr> wrote: > 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.miljeno...@gmail.com http://IvanMiljenovic.wordpress.com _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe