Formated output with ghci

A 'stupid' question (sort of an embarassing one): I want to do formated output by converting data types to strings and the bring them in a formated way together. I use ghci 6.4 and when I want to see this text then it is shown as a string (i.e. with "... " added around) and the formating characters in the text (e.g. \n) are quoted and not executed. (if I apply show to the text string, then the above is done twice!) This does occur if I use a defined function (something like 'toString' or 'text') and does not occur if I use show (but I have other reasons not to use show). Is there a cure to have output formated with ghci without using show to individually convert data types into strings? Here an example output: text s2 "last id used #2\n\n(#2,EntType {unEntType = \"Point\"})\n(#1,EntType {unEntType = \"Point \"})\n\n\n deleted\nRelX empty\n\nHCons (Region2start \"start of region\",RelX empty\n) ( HCons (Region2end \"end of region\",RelX empty\n) (HCons (Point2coord \"Coordinates of Poi nt\",\n(#2,\n[NV 0.0 100.0])\n(#1,\n[NV 0.0 0.0])\n\n) HNil))" Wrapping the text string into a data type and then apply show to this data type gives also the desired result. Is there an easier way? Help is highly appreciated module OutputTest where data X = X Int Int Float deriving (Show) x1 = X 3 4 4.5 text :: X -> String text (X a b c) = show a ++ show b ++ " \n" ++ show c -- example output -- >text x1 --"34 \n4.5" data T a = T a instance Show a => Show (T a) where show (T a) = "Tx " ++ show a tx1 = T x1 instance Show (T X) where show (T a) = text a -------- works: -- >tx1 --34 --4.5

On 14/01/06, Frank
A 'stupid' question (sort of an embarassing one):
I want to do formated output by converting data types to strings and the bring them in a formated way together. I use ghci 6.4 and when I want to see this text then it is shown as a string (i.e. with "... " added around) and the formating characters in the text (e.g. \n) are quoted and not executed. (if I apply show to the text string, then the above is done twice!)
This does occur if I use a defined function (something like 'toString' or 'text') and does not occur if I use show (but I have other reasons not to use show).
Is there a cure to have output formated with ghci without using show to individually convert data types into strings?
Here an example output:
text s2 "last id used #2\n\n(#2,EntType {unEntType = \"Point\"})\n(#1,EntType {unEntType = \"Point \"})\n\n\n deleted\nRelX empty\n\nHCons (Region2start \"start of region\",RelX empty\n) ( HCons (Region2end \"end of region\",RelX empty\n) (HCons (Point2coord \"Coordinates of Poi nt\",\n(#2,\n[NV 0.0 100.0])\n(#1,\n[NV 0.0 0.0])\n\n) HNil))"
Wrapping the text string into a data type and then apply show to this data type gives also the desired result. Is there an easier way?
Help is highly appreciated
module OutputTest where
data X = X Int Int Float deriving (Show)
x1 = X 3 4 4.5
text :: X -> String text (X a b c) = show a ++ show b ++ " \n" ++ show c
-- example output -- >text x1 --"34 \n4.5"
data T a = T a
instance Show a => Show (T a) where show (T a) = "Tx " ++ show a
tx1 = T x1
instance Show (T X) where show (T a) = text a
-------- works: -- >tx1 --34 --4.5
Basically, GHCi and Hugs follow the rule that if the expression you type is an IO action, then that action gets run, and otherwise, the function 'print' is applied to it automatically, to print the value. The print function is the composition of putStrLn with show, and the show instance for Strings quotes them. The solution is to explicitly apply putStrLn to your String value rather than letting it be quoted.
putStrLn $ text x1 34 4.5
- Cale
participants (2)
-
Cale Gibbard
-
Frank