
Am Donnerstag, 29. Januar 2009 17:28 schrieb emmanuel.delaborde:
On 29 Jan 2009, at 16:10, beginners-request@haskell.org wrote:
Content-Type: text/plain; charset="iso-8859-1"
I didn't compile, but, by the looks of it, I would change
import qualified Data.ByteString as BS (readFile)
for
import qualified Data.ByteString.Lazy as BS (readFile)
as it seems sha1 needs a lazy bytestring
Thanks ! It compiles now but brings me to my real problem :) If I uncomment this line
"md5" -> md5sum
I get the following :
------
module Main where
import System.Environment (getArgs) import Data.Digest.OpenSSL.MD5 (md5sum) import Data.Digest.Pure.SHA (sha1, showDigest) import qualified Data.ByteString.Lazy as BS (readFile)
-- sha1 :: ByteString -> Digest -- readFile :: FilePath -> IO ByteString -- md5sum :: ByteString -> String -- showDigest :: Digest -> String
checkHash :: String -> String -> String -> IO () checkHash codec hash file = let f = case codec of "md5" -> md5sum "sha1" -> showDigest . sha1 _ -> error "Codec must be md5 or sha1 !" in BS.readFile file >>= \fileBS -> let fileHash = f fileBS in print (hash == fileHash)
main = getArgs >>= \as -> case as of (codec:hash:file:_) -> checkHash codec hash file _ -> usage
usage = print "checksum codec hash file"
------
which now fails to compile with this error :
checksum.hs:17:22: Couldn't match expected type `Data.ByteString.Internal.ByteString' against inferred type `Data.ByteString.Lazy.Internal.ByteString' In the expression: showDigest . sha1 In a case alternative: "sha1" -> showDigest . sha1 In the expression: case codec of { "md5" -> md5sum "sha1" -> showDigest . sha1 _ -> error "Codec must be md5 or sha1 !" }
How can I both use md5sum and sha1 when one use a lazy ByteString end the other one does not ?
Convert lazy to strict ByteStrings before using md5sum import qualified Data.ByteString as S -- strict ByteStrings import qualified Data.ByteString.Lazy as L checkHash :: String -> String -> String -> IO () checkHash codec hash file = let f = case codec of "md5" -> md5sum . S.concat . L.toChunks "sha1" -> showDigest . sha1 _ -> error "Codec must be md5 or sha1 !" in L.readFile file >>= \fileBS -> let fileHash = f fileBS in print (hash == fileHash) or the other way round: checkHash :: String -> String -> String -> IO () checkHash codec hash file = let f = case codec of "md5" -> md5sum "sha1" -> showDigest . sha1 . L.fromChunks . (:[]) _ -> error "Codec must be md5 or sha1 !" in S.readFile file >>= \fileBS -> let fileHash = f fileBS in print (hash == fileHash)
Thanks
E
Cheers, Daniel