Handling binary and textual data
The smallest piece of data is a bit (0 or 1), which is isomorphic to Bool
(True
or False
). When you need just one bit, a Bool should be your choice. If you need a few bits, then a tuple of Bools will fit the purpose when performance is not critical. A [Bool]
is sometimes convenient, but should only be chosen for convenience in some situations.
For high-performance binary data, you could define your own data type with strict Bool fields. But this has an important caveat, namely that Bool is not a primitive but an algebraic data type:
data Bool = False | True
The consequence is that you cannot unpack a Bool similar to how you could an Int or Double. In Haskell, Bool values will always be represented by pointers. Fortunately for many bit-fiddling applications, you can define a data type like this:
data BitStruct = BitStore !Bool !Bool !Bool
This will get respectable performance. However, if you need a whole array of bits it quickly becomes inconvenient to define...