Haskell Resources
Compilation of useful resources i've used to learn Haskell
[WIP] I will keep updating it as i find new resources (My only rule is to understand the resource before putting it here).
Haskell
Why Haskell
- Why learn Haskell.
- Hello Haskell, Goodbye Lisp
- Why not Haskell?
- Haskell Is Beautifull In Practice
- First thoughts on Haskell
Learning Haskell
- Haskell Fast & Hard
- School of Haskell
- Learn You a Haskell: Starting Out
- Learn You a Haskell: Types and Typeclasses
- Learn You a Haskell: Syntax in Functions
- Learn You a Haskell: Recursion
- Learn You a Haskell: Higher order functions
- Learn Haskell Fast and Hard
- What i wish i knew when learning haskell
- Functional Education
- CIS 194: Introduction to Haskell (Spring 2013)
- NICTA Functional Programming Course
- Learn Haskell
- How to read Haskell
- Haskell: The Confusing Parts
- Random thoughts on Haskell
- 10 things I learnt diving in the functional programming deep end β with Haskell
- How to learn Haskell
- On Haskell, Intuition And Expressive Power
- Four months with Haskell
- Haskell for C Programmers - For Loops
Currying
Examples
Data structures
- Zipper.
- List comprehension
- Lists and tuples
- Higher-order list operations
- map-syntax package
- psqueues package
- Finger Trees Done Right (I hope)
- Monoids and Finger Trees
- Finger Trees
- Zippers: Making Functional βUpdatesβ Efficient
- Functional Pearls: The Zipper
- Enumerator and iteratee
- Okasaki's Lazy Queues
- Haskell: Queues without pointers
- Hashtables library
- Tree Traversal, Depth first and Breadth first in Haskell
- Non Empty List
- Trie in Haskell
- A Trie in Haskell (Part 1)
Types
- Haskell: Explicit type declarations in GHCI
- The Algebra of Algebraic Data Types, Part 1
- The Algebra of Algebraic Data Types, Part 2
- The Algebra of Algebraic Data Types, Part 3
- Typeclasses: Polymorphism in Haskell
- Polymorphism
- Haskell Impredicative types
- Constructor
- Algebraic Data Types
- CIS 194 - More polymorphism and type classes
- OOP vs type classes
- data, type, newtype, instance, class
- Newtype
- data, type, newtype, instance, class
- Dependent type
- Smart constructors
- Typed type-level programming in Haskell, part I: functional dependencies
- Haskell/Existentially quantified types
- Phantom types
- Using Phantom Types for Extra Safety
- Empty type
- Haskell's Type Classes: We Can Do Better
- Summary of the paper Making ad-hoc polymorphism less ad hoc
- Paper How to make ad-hoc polymorphism less ad hoc
- Kind (type theory)
- Typed type-level programming in Haskell, part I: functional dependencies
- Typed type-level programming in Haskell, part II: type families
- Bottom
- Typed Holes
- Existential Quantification in Haskell
- Using Phantom Types for Extra Safety
- Haskell/Phantom types
- Newtypes Aren't As Cool As You Think
- Types, and two approaches to problem solving
Concepts
- Lazy evaluation.
- Recursion patterns, polymorphism, and the Prelude
- Lazy vs. non-strict
- Non-strict semantics
- Performance/Strictness
- Combinator
- Haskell Laziness
- [More Points For Lazy Evaluation](http://augustss.blogspot.fr/2011/05/more-points-for-lazy-evaluation-in.html#91796925570475496* Point-Free Style: What is it good for ?
Module System
Comparison with other languages
Functions
- Infix operator
- Custom Infix Operators in Haskell
- Pointfree
- Fold
- Haskell: Foldl as Foldr
- Haskell- foldl and foldr?
- Folding infinite lists in Haskell
- Higher Order Programming and Type Inference
- Folds and monoids
- [Applicative functors, Part I](http://www.se as.upenn.edu/~cis194/spring13/lectures/10-applicative.html)
- Monads
- Combinator
- How I finally understood the Y Combinator (and blew my damn mind)
- Partial functions
- Let vs. Where
- Eta conversion
- Sum Types, Visitors, and the Expression Problem
- Deriving list scans
Applicative
- FP newbie learns a little about applicatives
- The basics of applicative functors, put to practical work
- Applicative functor
- Typeclassopedia Applicative
Solving problems with Haskell
Operators
- Custom Infix Operators in Haskell
- Accumulators in Haskell
- Haskell Pronunciation
- Pronounceable names for common Haskell operators
Interesting Blog Posts
Tools
- Hoogle: Haskell API search engine
- Hackage.
- Cabal-install.
- Repeat after me: "Cabal is not a Package Manager"
- Haddock.
- Using Emacs for Haskell development
- Hayoo! - Haskell API Search
- Hlint
- Shake
- Haskell is easy: Reference for best libraries to use
- Codex: A ctags file generator for cabal/stack project dependencies
- Blunt: converts Haskell expressions between the pointfree and pointful styles
- Pointfree package
- pointful package
- ghci-color: colorize ghci output
- hsimport
- Halberd: tool to help you add missing imports to your Haskell source files
Performance
- Criterion
- Haskell from C: Where are the for Loops?
- Floating Point: Don't use Float
- How to calculate binomial coefficients Part 1
- How to calculate binomial coefficients Part 2
- Efficient Binomial Coefficients
Editors
Database
- Persistent
- postgresql-simple: Mid-Level PostgreSQL client library
- groundhog package
- persistent package
- Custom SQL queries in Groundhog
- Groundhog and Converters Tutorial
- Creating sqlite tables with Groundhog's default settings
Concurrency
Web developement libraries
- Yesod.
- Wai: Haskell Web Application Interface
- Scotty
- Wai middlewares
- Snap Framework
- snap-blaze: blaze-html integration for Snap
- Lucid: read and edit DSL for writing HTML
- Heist
- Hedis
- digestive-functors
- formlets: The essence of form abstraction
- web-routes
- restful-snap package
- snap-extras package
- Servant
Web developement learning
- Haskell Buildpack for Heroku
- Demo of the Heroku Haskell Buildpack
- 24 Days of Hackage: scotty
- 24 Days of Hackage: snap
- A REST API with Haskell and Snap
- A Quick Into to Snap
- The Web Problem, and solving it in Haskell
- What are Snaplets ?
- Heist Templates
- Compiled Heist: The Walkthrough
- 24 Days of Hackage: digestive-functors
- digestive-functors tutorial
- digestive-functors for Snap users
Testing
- QuickCheck, On Github.
- Assertions in Haskell
- test-framework and on github
- Code testing in Haskell
- The tasty-golden package
- Practical testing in Haskell
- Hspec: A Testing Framework for Haskell
- crosscheck: Using QuickCheck to test functions in other languages/environments
- haskell-hspec-setup: Add a hspec test-suite in one command
- HUnit: A unit testing framework for Haskell
- doctest: An implementation of Python's doctest for Haskell
- hpc: Haskell program coverage
- QuickCheck Manual
- Tasty
- SmallCheck
- QuickCheck: Type-directed Property Testing
- QuickCheck 2
- System.FilePath, automated testing
- A brief intro to QuickCheck
Debugging
Basic Libraries
- Data.Either
- Either and (,) in Haskell are not arbitrary
- Data.Function
- Data.Data
- Split: Combinator library for splitting lists
- Text
- Typeable and Data in Haskell
- Data.Sequence
String Types
Algorithms
- Knuth-Morris-Pratt in Haskell
- Sorting algorithms in Haskell
- Flood Fill Algorithm in Haskell
- Using Flood Fill to solve a maze problem
- Purely Functional Tree Search in Haskell
- Haskell: Maximum Int value
- Median-of-Medians in Haskell
- The KMP algorithm in Haskell
- Lazy Dynamic Programming
- Descending sort in Haskell
- Quicksort and k-th smallest elements
Algorithms Analysis
Functors
- How do functors work in haskell?
- Haskell Applicative Functors Explained Without Words
- Thing I Learned Today: Functors in Haskell
Profunctors
Foldable and Traversable
Monoids
- Monoids - Typeclassopedia
- Haskell Monoids and their Uses
- Data.Monoid
- Monoid: Haskell: Using monoids when sorting by multiple parameters
- Understanding Free Monoids and Universal Constructions
- Monoid
- Monoids in Haskell
- Defaults
Monads
- Research papers on Monads and arrows
- The category design pattern
- The State Monad: A Tutorial for the Confused?
- transformers package
- mtl: Monad transformers library
- Transformers package
- Tardis package
- monad-logger package
- Control.Monad.Reader
- Comonad
- Streaming logging
- Monads: A Language Designer's perspective
IO
Monad Transformers
- Grok Haskell Monad Transformers
- Building Monad Transformers - Part 1
- Monad Transformers Tutorial
- Monad morphisms
- mmorph package
- Monad Transformer: Stephen Diehl tutorial
- Monad Transformers history Blog post
- In Praise of EitherT
- Effectful Haskell: Reader, Transformers, Typeclasses
- Typeclassopedia's section on Monad transformers
- haskell trick #1: using ErrorT
Arrows
- Arrow
- Arrows: A General Interface to Computation
- arrows: Arrow classes and transformers package
- When to use Arrows over Monads
- Some papers related to Arrows
Fudgets
Lenses
- Lens
- Getting Started
- Program imperatively using Haskell lenses
- Haskell for all blog: Lenses
- Explicit is better than implicit
Category Theory
- Category: The Essence of Composition
- Haskell controvariant package
- data-category package
- Catamorphism package
- The mmorph package
- Category theory
- Category theory/Functor
- categories from category-extras
- adjunctions
- Understanding Yoneda
- Ncatlab: Monoidal category
- Monoidal categories
- Wikipedia: Monoidal Category
- Monoidal Functor
- Category theory/Natural transformation
- Morphism
- You Could Have Defined Natural Transformations
- Whatβs a natural transformation?
- Universal Properties
- Kleisli category
Dependent Types
UI in Haskell
- Phooey: Functional UI library for Haskell
- Tangible Value - TV : a library for composing tangible values
FRP
- Reflex: Higher-order Functional Reactive Programming
- Grapefruit: Library for Functional Reactive Programming
- Grapefruit/Comparison to other FRP libraries
- Reactive
- Functional Reactive Animation
- Simply efficient functional reactivity
Continuation Passing Style
Parsing
- parsec
- attoparsec
- Attoparsec or Parsec in Haskell
- An Introduction to the Parsec Library
- Parsec, a fast combinator parser
Exception Handling and Error Reporting
Parallelism
Configuration
Extensions
- 24 Days of GHC Extensions: Template Haskell
- 24 Days of GHC Extensions: Record Wildcards
- Record wildcards
- 24 Days of GHC Extensions: Deriving
- 24 Days of GHC Extensions: Multi-parameter Type Classes
DSLs
- Quasiquotation
- shakespeare-text package
- dump: Dumps the names and values of expressions to ease debugging
Sample Projects
Projects
Cheat Sheets
Haskell Code style
Blogs
- Getting Values Out of Monads
- Andrew Gibiansky :: Math β Code
- Mark Needham Blog
- Ξ» Tony's blog Ξ»
- Neil Mitchell's Haskell Blog
- Stephen Diehl Blog
- Haskell for all
- Functional Programming Debugs You
- Blog Inside 736-131
- A Neighborhood of Infinity
- Random Determinism
- Yet Another Lambda Blog
- Philip Wadler's Blog
- Chris Done Blog
- Jasper Van der Jeugt Blog
- Cabal Testing Summer Of Code
- Jakub Arnold's Blog
- The Most Fun You Have Blog
- Danny Navarro's Blog
- The Comonad.Reader
- CPS is great! CPS is terrible!
- Bryan O'Sullivan's Blog
- Brandon.Si(mmons)
- NP-Incompleteness Blog posts by Guilherme Kunigami on Haskell
- Brent Yorgey's Blog
- Jaguarpaw Blog
- Alexey Shmalko's Blog
- Brian Shourd's Blog
- Dave Menendez Blog
- Caffeinated code Blog
- Martin Oldfield Blog
- tatterdemalion: writings by stuart popejoy
- Types and Tailcalls - yet another programmer's blog
- Covariant.me blog
Learning Resources
- haskell-bookmarks
- haskell-must-watch
- awesome-haskell
- Pack of resources and exercises for learning Haskell.
- A collection of links for the new haskeller
- Useful online resources to learn Haskell
Papers
Monad Reader Issues
Libraries
- Haskell Hierarchical Libraries
- The Happy parser generator for Haskell
- miniKaren implementation in Haskell
- Haxl
- Template Haskell
- Haskell Packages by category
- Haskell MVC: mvc library to distill concurrent programs into pure and single-threaded programs using the Model-View-Controller pattern
- Pipes: stream processing library that lets you build and connect reusable streaming components
- Folds: a playground full of comonadic folds
- Mono-Traversable, on github
- Conduit, on github
- Warp HTTP Server
- pipes-group: ses FreeT and lenses to group streams into sub-streams
- Lens, on github
- Haskell-Annah-Library: Distributed programming language that desugars to Morte
- A bare-bones calculus-of-constructions
- http-streams
- io-streams
- semigroups
- 24 Days of Hackage: contravariant
- constraints package
- Aeson
- LRU caching
- LRU cache
- pqueue: A fast, reliable priority queue implementation based on a binomial heap.
- safe package: wrapping Prelude/Data.List functions that can throw exceptions