On Sunday 12 May 2002 03:50 am, Sebastien Carlier wrote: > >>> the python string notation (str % tuple) would fit really well too... > >>> putStrLn "hello %s, you got %d right" % ("oliver", 5) > >> > >> Might be nice. > > > > What would be the type of putStrLn then? > > The type of putStrLn would remain unchanged. > > The idea would be to let the compiler translate the string > "hello %s, you got %d right" > into the function > (\ (p1, p2) -> "hello " ++ p1 ++ ", you got " ++ show p2 ++ " right") > so that the type system can do its work. Then the % above is only an > application. > There is of course no need for the tuple; a curried function would > probably be more convenient.
Here is a printf-style function that I hacked up this morning; it uses type classes but it doesn't need functional dependencies: module Printf where main = putStrLn $ printf "%i * %c = %d %s." (2::Integer) 'c' (6.0e8::Double) "meters/sec" class Printf a where printf :: String -> a printf' :: ShowS -> String -> a printf = printf' id instance Printf String where printf' pre pattern = pre pattern instance (Format a, Printf b) => Printf (a -> b) where printf' pre pattern x = let (text, pat') = break ('%'==) pattern (formatted, rest) = format x pat' in printf' (pre . showString text . showString formatted) rest -------------------------------------------- class Format a where format :: a -> String -> (String, String) instance Format Char where format c pat = case pat of '%':'c':rest -> ([c],rest) _ -> error "printf: extra char argument" instance Format String where format s pat = case pat of '%':'s':rest -> (s,rest) _ -> error "printf: extra string argument" instance Format Integer where format i pat = case pat of '%':'i':rest -> (show i,rest) _ -> error "printf: extra integer argument" instance Format Double where format d pat = case pat of '%':'d':rest -> (show d,rest) _ -> error "printf: extra double argument" _______________________________________________ Haskell mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell