
On Tue, Nov 09, 2010 at 11:44:42AM -0800, Russ Abbott wrote:
I wasn't at a computer with Haskell when I wrote the earlier message. Here's how it seems to work.
File:
*data *MyType = MyType
*instance *Show MyType *where* show MyType = "a\nb"
There's nothing too magical going on here. Remember that show just converts a value to a String. How that String is then displayed depends on what you do with it, not with the definition of show.
Load the above file. Then:
MyType -- This does what I want it to do after all. a b
ghci essentially does "putStrLn . show" on the results of expressions typed at the prompt. So the call to show results in the string consisting of an a, a newline, and a b, and putStrLn prints that string to the screen (with the newline interpreted appropriately).
show MyType "a\nb"
'show MyType' is an expression of type String. Doing putStrLn . show on it causes show to be called on the string, which converts it to a form surrounded by quotes and with control characters escaped. The resulting string is then printed to the screen.
putStrLn (show MyType) a b
This is the same as the first example, since IO actions entered at the ghci prompt are simply run.
print MyType a b
This is also the same, since print = putStrLn . show.