On Fri, Feb 21, 2003 at 06:33:10PM +0100, Stefan Karrmann wrote:
Mike T. Machenry (Wed, Feb 19, 2003 at 10:23:45PM -0500):
Question 1: Is there an easier, more elegant way to write this code?
output a b c d e = println "Hello, this is " ++ show a ++ " a really hard " "to write function that " ++ show b ++ " would be easier to write with " "a printf " ++ show c ++ show d ++ show e You can write a printf-like function in Haskell, s.t. output = <construct-printf.hs>
google it, since I do not remember the location of the paper.
I don't remember the paper's URL either, but here is a sample implementation: data End = End data L fmt = L String fmt data S fmt = S fmt data I fmt = I fmt class Format fmt x | fmt->x where format' :: fmt -> String -> x instance Format End String where format' (End) out = out instance (Format fmt x) => Format (L fmt) x where format' (L s fmt) out = format' fmt (out++s) instance (Format fmt x) => Format (S fmt) (String->x) where format' (S fmt) out = \s -> format' fmt (out++s) instance (Format fmt x) => Format (I fmt) (Int->x) where format' (I fmt) out = \i -> format' fmt (out++ show i) format :: (Format fmt x) => (End -> fmt) -> x format f = format' (f End) "" lit = L str = S int = I main = putStrLn (format (int.lit " is ".str) 5 "five") So you see the part (int.lit " is ".str) is to construct something like "%d is %s" in printf. You may extend the idea to support other types too. Regards, .paul.