
In the following code: prefix_md5 :: String -> Data.ByteString.ByteString prefix_md5 filename = do let prefix_length = 1024 file <- System.IO.openBinaryFile filename System.IO.ReadMode :: (IO System.IO.Handle) data_read <- Data.ByteString.hGet file prefix_length :: (IO Data.ByteString.ByteString) _ <- System.IO.hClose file let hasher = Crypto.Hash.MD5.init :: Crypto.Hash.MD5.Ctx let hasher2 = Crypto.Hash.MD5.update hasher data_read :: Crypto.Hash.MD5.Ctx let digest = Crypto.Hash.MD5.finalize hasher2 :: Data.ByteString.ByteString return digest :: (IO Data.ByteString.ByteString) I get the error: Md5s.hs:13:5: Couldn't match type `IO Data.ByteString.ByteString' with `Data.ByteString.ByteString' Expected type: IO System.IO.Handle -> (System.IO.Handle -> IO Data.ByteString.ByteString) -> Data.ByteString.ByteString Actual type: IO System.IO.Handle -> (System.IO.Handle -> IO Data.ByteString.ByteString) -> IO Data.ByteString.ByteString In a stmt of a 'do' block: file <- System.IO.openBinaryFile filename System.IO.ReadMode :: IO System.IO.Handle How should I interpret that error to solve this kind of problem on my own in the future? I don't see where the line in question does anything with ByteString's! How might I correct this function to eliminate the error? Thanks! -- Dan Stromberg