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


Reply via email to