Book Image

Haskell Design Patterns

By : Tikhon Jelvis, Ryan Lemmer
Book Image

Haskell Design Patterns

By: Tikhon Jelvis, Ryan Lemmer

Overview of this book

Design patterns and idioms can widen our perspective by showing us where to look, what to look at, and ultimately how to see what we are looking at. At their best, patterns are a shorthand method of communicating better ways to code (writing less, more maintainable, and more efficient code) This book starts with Haskell 98 and through the lens of patterns and idioms investigates the key advances and programming styles that together make "modern Haskell". Your journey begins with the three pillars of Haskell. Then you'll experience the problem with Lazy I/O, together with a solution. You'll also trace the hierarchy formed by Functor, Applicative, Arrow, and Monad. Next you'll explore how Fold and Map are generalized by Foldable and Traversable, which in turn is unified in a broader context by functional Lenses. You'll delve more deeply into the Type system, which will prepare you for an overview of Generic programming. In conclusion you go to the edge of Haskell by investigating the Kind system and how this relates to Dependently-typed programming
Table of Contents (14 chapters)

Patterns of generic programming


Jeremy Gibbons describes seven patterns of generic programming, where each pattern is viewed as a different kind of parameterization. For more information, refer to Datatype-Generic Programming (available at http://www.cs.ox.ac.uk/jeremy.gibbons/publications/dgp.pdf).

Patterns 1 and 2 – functions

Functions parameterized by values are more general than functions with hardcoded values. This is the most simple kind of generic programming.

Functions parameterized by functions (higher order functions) represent a more powerful form of genericity.

Pattern 3 – polymorphic types and functions

Polymorphism can also be viewed as a pattern of generic programming. For example, when we parameterize types by other types (type polymorphism):

  Tree a = Leaf a | Node a (Tree a)
  – is more generic than
  TreeI  = Leaf Int | Node Int TreeI

Or when we parameterize functions by types (function polymorphism):

  f :: Tree a → a
  – is more generic than
  g :: String → String

Pattern 4...