Simon L Peyton Jones wrote:
> [...] Let me advertise Olivier Danvy's very cunning idea to implement
> printf in Haskell/ML.
>
> http://www.brics.dk/RS/98/5/index.html
Very cunning, indeed. But it has as small efficiency problem because
of the use of (++). This can be easily cured by using ShowS:
--------------------------------------------------------------------
-- Slightly inefficient "Formatting Strings in Haskell" version of
-- Olivier Danvy's "Formatting Strings in ML"
-- p_ is like i_, but works for everything Show-able
p_ :: Show b => (String -> a) -> String -> b -> a
p_ k s x = k (s ++ show x)
s_ :: (String -> a) -> String -> String -> a
s_ k s x = k (s ++ x)
l_ :: String -> (String -> a) -> String -> a
l_ x k s = k (s ++ x)
n_ :: (String -> a) -> String -> a
n_ k s = k (s ++ "\n")
format :: ((String -> String) -> String -> a) -> a
format c = c id ""
--------------------------------------------------------------------
--------------------------------------------------------------------
-- (Hopefully) improved version
p_ :: Show c => (ShowS -> a) -> ShowS -> c -> a
p_ k s x = k (s . shows x)
s_ :: (ShowS -> a) -> ShowS -> String -> a
s_ k s x = k (s . showString x)
l_ :: String -> (ShowS -> a) -> ShowS -> a
l_ x k s = k (s . showString x)
n_ :: (ShowS -> a) -> ShowS -> a
n_ k s = k (s . showChar '\n')
format :: ((ShowS -> ShowS) -> ShowS -> a) -> a
format c = c id id
--------------------------------------------------------------------
Example:
format (l_ "Foo" . p_ . s_ . p_ . n_) (2+2) "y" True ""
=> "Foo4yTrue\n"
--
Sven Panne Tel.: +49/89/2178-2235
LMU, Institut fuer Informatik FAX : +49/89/2178-2211
LFE Programmier- und Modellierungssprachen Oettingenstr. 67
mailto:[EMAIL PROTECTED] D-80538 Muenchen
http://www.pms.informatik.uni-muenchen.de/mitarbeiter/panne