* Format.sprintf and "%a"
@ 2000-11-23 11:54 jim.rauser
2000-11-23 12:42 ` Pierre Weis
0 siblings, 1 reply; 2+ messages in thread
From: jim.rauser @ 2000-11-23 11:54 UTC (permalink / raw)
To: caml-list
Hello,
I'm teaching myself Ocaml and have run up against a problem I can't
solve in connection with the format module. For many of the types
in my code, I have defined pretty-printing functions with type
(Format.formatter -> <type> -> unit), e.g.,
type foo = Foo | Bar
let fmt_foo f x =
match x with
Foo -> Format.fprintf f "Foo"
| Bar -> Format.fprintf f "Bar"
in
Format.printf "Test: %a@." fmt_foo Foo
Works great, but when I try it with sprintf, I get the following:
let s = Format.sprintf "Test: %a@." fmt_foo Foo
This expression has type
((Format.formatter -> foo -> unit) -> foo -> unit,
Format.formatter, unit)
format
but is here used with type
((Format.formatter -> foo -> unit) -> foo -> unit,
unit, string)
format
[Note: I retyped these examples by hand, I hope they're accurate.]
I can see the correlation of the signatures in the error message to
those of fprintf and sprintf in Format.mli, but the type magic that
seems to be occuring in the implementation of the Format modules
is beyond me. Can someone explain what is going on here? Is
there a way to use my formatting functions with sprintf?
Thanks, Jim
------------------------------------------------------------------------
Jim Rauser mailto:rauser@qcentic.de
Qcentic GmbH
Max-Planck-Str. 39a Tel: 02234/950 36 16
D-50858 Koeln Fax: 02234/27 19 17
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: Format.sprintf and "%a"
2000-11-23 11:54 Format.sprintf and "%a" jim.rauser
@ 2000-11-23 12:42 ` Pierre Weis
0 siblings, 0 replies; 2+ messages in thread
From: Pierre Weis @ 2000-11-23 12:42 UTC (permalink / raw)
To: jim.rauser; +Cc: caml-list
> Hello,
>
> I'm teaching myself Ocaml and have run up against a problem I can't
> solve in connection with the format module. For many of the types
> in my code, I have defined pretty-printing functions with type
> (Format.formatter -> <type> -> unit), e.g.,
>
> type foo = Foo | Bar
> let fmt_foo f x =
> match x with
> Foo -> Format.fprintf f "Foo"
> | Bar -> Format.fprintf f "Bar"
> in
> Format.printf "Test: %a@." fmt_foo Foo
>
> Works great, but when I try it with sprintf, I get the following:
>
> let s = Format.sprintf "Test: %a@." fmt_foo Foo
> This expression has type
> ((Format.formatter -> foo -> unit) -> foo -> unit,
> Format.formatter, unit)
> format
> but is here used with type
> ((Format.formatter -> foo -> unit) -> foo -> unit,
> unit, string)
> format
>
> [Note: I retyped these examples by hand, I hope they're accurate.]
>
> I can see the correlation of the signatures in the error message to
> those of fprintf and sprintf in Format.mli, but the type magic that
> seems to be occuring in the implementation of the Format modules
> is beyond me. Can someone explain what is going on here?
Nothing more than the reported type error: your functions are
designed to return unit (they work by side effect) not string (which
would mean they are functional), and this is obviously uncompatible.
> Is there a way to use my formatting functions with sprintf?
Yes. Use the special Format.str_formatter predefined formatter. It
works as usual side effecting formatters (hence it is compatible wih
your fmt_* functions), except that it records the output into a string
buffer. Hence, you would have to flush str_formatter explicitely, to
get the corresponding string result. For instance:
let s =
Format.fprintf str_formatter "Test: %a@." fmt_foo Foo;
Format.flush_str_formatter ();;
val s : string = "Test: Foo\n"
Pierre Weis
INRIA, Projet Cristal, Pierre.Weis@inria.fr, http://cristal.inria.fr/~weis/
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2000-11-23 12:42 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2000-11-23 11:54 Format.sprintf and "%a" jim.rauser
2000-11-23 12:42 ` Pierre Weis
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox