We began this chapter with GHC primitives such as Int#
and figured out the effects of strictness and unpacking annotations (bangs
and UNPACK
-pragmas) in data type definitions. We noted that tuples are lazy and that Bool is an algebraic data type, but we also noted that arrays and vectors represent Bool intelligently as single bits internally.
Then we considered working with numeric, binary, and textual data. We witnessed the performance of the bytestring
, text
, and vector
libraries, all of which get their speed from fusion optimizations, in contrast to linked lists, which have a huge overhead despite also being subject to fusion to some degree. However, linked lists give rise to simple difference lists and zippers. The builder patterns for lists
, bytestring
, and text
were introduced. We discovered that the array
package is low-level and clumsy compared to the superior vector
package, unless you must support Haskell 98. The Map type in containers
was a binary tree, whereas some hashing...