[Haskell-beginners] GHC 6.12, -fwarn-unused-do-bind and Text.Printf

Daniel Fischer daniel.is.fischer at web.de
Mon Feb 22 17:47:09 EST 2010


Am Montag 22 Februar 2010 23:02:13 schrieb Iustin Pop:
> Hi there,
>
> I'm trying to upgrade some code to ghc 6.12 but under -Wall, the new
> warning about unused do binds is triggering on Text.Printf.printf usage.
>
> This code:
>
> import Text.Printf
>
> main :: IO ()
> main = do
>   printf "Hello, world\n"
>   printf "Hello the second time\n"
>
> When run with runhaskell -Wall gives:
>
> Warning: A do-notation statement discarded a result of type
> GHC.Prim.Any. Suppress this warning by saying "_ <- printf "Hello,
> world\n"", or by using the flag -fno-warn-unused-do-bind.
>
> Now, I'm confused why such a simple usage of printf triggers this
> warning;

Because you don't bind the result of the first printf, which could be any 
type, so potentially interesting. The compiler doesn't know that 'printf 
fmt args' only ever returns undefined.

> enforcing the first printf to type IO () fixes the warning,

Yep, the compiler knows that a return value of type () is uninteresting 
enough to be discarded without warning.

> but it seems strange to no longer be able to simply write printf.
>
> Anyone knows a workaround, or can enlighten me what I'm doing wrong?

a) one of the options the compiler offered
b) expression type signature
c) use (>>) to explicitly tell the compiler "I want to discard the return 
value"

I'd probably use -fno-warn-unused-do-bind (as an OPTIONS_GHC pragma in the 
relevant files).

>
> A side question would be why we have "instance PrintfType (IO a)"
> instead of "instance PrintfType (IO ())";

Very good question.

> what use is there for that
> generic type? Can printf return anything else than IO () (when used
> under IO at all)?
>
> thanks,
> iustin



More information about the Beginners mailing list