<div dir="ltr"><div>I found this code on the net somewhere. It compiles and works properly:</div><div><br></div><div>import qualified Data.ByteString as BS<br>import Text.Printf (printf)<br>toHex :: BS.ByteString -> String<br>toHex bytes = do<br>  hex <- BS.unpack bytes<br>  printf "%02x" hex</div><div><br></div><div>I cannot understand the 'do' notation is required, because it seems to be a pure function. I guess there's a monad hiding somewhere that my newbie mind can't see.</div><div><br></div><div>So, I rewrote the code to remove the 'do stuff':</div><div><br></div><div>-- BAD<br></div><div>import qualified Data.ByteString as BS<br>import Text.Printf (printf)<br>toHex :: BS.ByteString -> String<br>toHex bytes = printf "02x" (BS.unpack bytes)</div><div><br></div><div>WRONG. Ghci says:</div><div><br></div><div>xx2.hs:5:15: error:<br>    • No instance for (Text.Printf.IsChar GHC.Word.Word8)<br>        arising from a use of ‘printf’<br>    • In the expression: printf "02x" (BS.unpack bytes)<br>      In an equation for ‘toHex’:<br>          toHex bytes = printf "02x" (BS.unpack bytes)<br>  |<br>5 | toHex bytes = printf "02x" (BS.unpack bytes)<br>  |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^</div><div><br></div><div>Can someone please explain to me:</div><div>1. Why does this simple-looking code to convert a bytestring to a string of hex characters require 'do' or equivalent code?</div><div>2. What is the specific problem with my version of the code. The error message doesn't mean much to me yet.<br></div><div><br></div><div><br></div></div>