[Haskell-beginners] Question about code I found

Terry Phelps tgphelps50 at gmail.com
Sun Jul 7 15:24:47 UTC 2019


I found this code on the net somewhere. It compiles and works properly:

import qualified Data.ByteString as BS
import Text.Printf (printf)
toHex :: BS.ByteString -> String
toHex bytes = do
  hex <- BS.unpack bytes
  printf "%02x" hex

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.

So, I rewrote the code to remove the 'do stuff':

-- BAD
import qualified Data.ByteString as BS
import Text.Printf (printf)
toHex :: BS.ByteString -> String
toHex bytes = printf "02x" (BS.unpack bytes)

WRONG. Ghci says:

xx2.hs:5:15: error:
    • No instance for (Text.Printf.IsChar GHC.Word.Word8)
        arising from a use of ‘printf’
    • In the expression: printf "02x" (BS.unpack bytes)
      In an equation for ‘toHex’:
          toHex bytes = printf "02x" (BS.unpack bytes)
  |
5 | toHex bytes = printf "02x" (BS.unpack bytes)
  |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Can someone please explain to me:
1. Why does this simple-looking code to convert a bytestring to a string of
hex characters require 'do' or equivalent code?
2. What is the specific problem with my version of the code. The error
message doesn't mean much to me yet.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/beginners/attachments/20190707/14bf0fbb/attachment.html>


More information about the Beginners mailing list