Learning Abstract Algebra by implementing common concepts in Haskell.