23
votes

Running the following code:

import Crypto.BCrypt
import Data.ByteString.Lazy.Char8

main = do
  maybe_pwhash <- hashPasswordUsingPolicy slowerBcryptHashingPolicy (pack "hunter2")
  print $ maybe_pwhash

I get the following compilation error:

test.hs:5:70:
    Couldn't match expected type `Data.ByteString.Internal.ByteString'
                with actual type `ByteString'
    In the return type of a call of `pack'
    In the second argument of `hashPasswordUsingPolicy', namely
      `(C.pack "hunter2")'
    In a stmt of a 'do' block:
      maybe_pwhash <- hashPasswordUsingPolicy
                        slowerBcryptHashingPolicy (pack "hunter2")

I am confused because I don't see why there is a difference between a Data.ByteString.Internal.ByteString and a ByteString.

1
Answering my own question because I had already written most of it by the time I managed to figure it out... Anyway, I still don't really understand the difference between all the different bytestring types and modules (´Lazy` vs Strict, ByteString.Char8 vs ByteString, etc) and the haskellwiki article on that seems to be just a stub. Any explanations on that would be much appreciated.hugomg
There are two different types of ByteStrings: lazy and strict. If the module name is not qualified with Lazy, then it uses strict ByteString. A lazy ByteString is essentially a linked list of strict ByteString.user2407038

1 Answers

10
votes

According to the bcrypt docs, you should be using strict bytestrings

import Data.ByteString.Char8

instead of the lazy ones:

import Data.ByteString.Lazy.Char8