Pick of the Week

As of March 2020, School of Haskell has been switched to read-only mode.

A weekly selection of interesting tutorials created by our users

Here's a selection of content published by the users of the School of Haskell -- the latest pick on top. We pick articles based on their quality and popularity. If you want your content to appear here, first publish it on your page and promote it. With enough page views it will register on our radar.

This week: Dan Burton's series "Coroutines for Streaming"

  • Gabriel Gonzalez

    Pipes tutorial 12 Apr 2014Gabriel Gonzalez

    An extended tutorial describing the API, idioms, and theory behind the pipes library
  • Harold Carr

    example of why to use monads - what they can do 6 Apr 2014Harold Carr

    shows why one would want to use monads - what they can do (not how they work)
  • Alberto Gómez Corona

    How Haskell can solve the integration problem 7 Mar 2014Alberto Gómez Corona

    Will show how long running tasks, Web apps, workflows, EAI Orchestration and BPM applications share the same underlying problem: The "integration problem", that only haskell can solve with more simplicity, generality and maintainability
  • Alberto Gómez Corona

    MFlow as a DSL for Web applications 21 Nov 2013Alberto Gómez Corona

    This tutorial shows some example of the use of [MFlow](http://hackage.haskell.org/package/MFlow) as a DSL for web applications rather than as a web framework as such made of heterogeneous stuff. This tutorial modify step by step a simple application, that ask for two numbers and show the result, with different applicative and monadic combinators, adding also some modifiers to create from a multipage application to a single page application, AJAX driven, with autorefresh, push, runtime templating and so on. All of them by adding composable, type safe haskell elements under a single paradigm.
  • Edward Kmett

    Part I: Deamortized ST 8 Nov 2013Edward Kmett

    This is a slow exploration of a novel approach to deamortization in Haskell, that lets us implement more algorithms with a fully functional persistent API, with previously unachievable asymptotics.
  • Daniel Diaz Carrete

    Compiled Heist insight, with no Snap in sight 1 Nov 2013Daniel Diaz Carrete

    A compiled Heist tutorial covering some common cases.
  • Joseph Abrahamson

    A Little Lens Starter Tutorial 28 Jul 2018Joseph Abrahamson

    A collection of common first time lens user questions in a little Socratic format.
  • Nikolay Murzin

    Web application with concurrency 10 Oct 2013Nikolay Murzin

    A simple Yesod app that downloads a file from given URL, shows download progress and calculates the hash sum of the file concurrently.
  • Carsten König

    coin change 14 Nov 2013Carsten König

    No description given.

  • lykahb

    Working with databases using Groundhog 13 Nov 2013lykahb

    A gentle introduction to Groundhog library
  • Edward Kmett

    Part III: A World in a Bottle 16 Nov 2013Edward Kmett

    Now I'll show how we can prevent our automata from using extrinsic properties of their location and show how this lets us bend space.
  • Erik Salaj

    Simple examples 29 Oct 2017Erik Salaj

    Simple examples
  • Edward Kmett

    Part II: PNGs and Moore 10 Jun 2015Edward Kmett

    In this part we'll explore how to make extensible folds for hashing, explore the connection between Gabriel Gonzales' `foldl` library and Moore machines, discover a Comonad, and concoct a way to generate custom PNGs by leveraging pieces of the existing Haskell ecosystem.
  • Edward Kmett

    Part I: From Theory to Pretty Pictures 29 Nov 2014Edward Kmett

    This post shows how we can render automata on the web using a number of reusable components from the Haskell ecosystem.
  • Bill Cauchois
  • DanBurton

    Coroutines for streaming DanBurton

    As the conduit- and pipes-style streaming abstractions continue to gain popularity, it is useful to take a look at an even higher abstraction from which they can be built: coroutines. In this series, we will learn about coroutines in general, select a particular "suspension functor," and then rebuild the Proxy type from pipes. This will help you understand the nature of control passing that underlies conduit and pipes.
  • Luke Taylor

    ByteString Bits and Pieces 9 Nov 2013Luke Taylor

    Beginner-level tutorial on ByteStrings and how to use them.
  • Dan Piponi

    The Mother of all Monads 21 Apr 2013Dan Piponi

    No description given.

  • Alfredo Di Napoli

    Episode 1 - JSON 7 Apr 2013Alfredo Di Napoli

    The bread and butter of each recipe (no pun intended)
  • Alexander Altman

    Guide to GHC Extensions Alexander Altman

    **A guide to the wide variety of Haskell extensions available in GHC, aimed at people who know most of the Standard Haskell core.** The extensions which are currently covered are: - [`BangPatterns`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/pattern-and-guard-extensions#bangpatterns) - [`BinaryLiterals`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/basic-syntax-extensions#binaryliterals) - [`DatatypeContexts`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/data-type-extensions#datatypecontexts) - [`DoAndIfThenElse`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/basic-syntax-extensions#doandifthenelse) - [`DoRec`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/basic-syntax-extensions#recursivedo-and-dorec) - [`EmptyCase`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/basic-syntax-extensions#emptycase) - [`EmptyDataDecls`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/data-type-extensions#emptydatadecls) - [`ExistentialQuantification`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/data-type-extensions#existentialquantification) - [`ExplicitForAll`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/explicit-forall#explicitforall) - [`GADTs`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/data-type-extensions#gadts) - [`GADTSyntax`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/data-type-extensions#gadtsyntax) - [`Haskell98`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/language-standards#haskell98) - [`Haskell2010`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/language-standards#haskell2010) - [`LambdaCase`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/basic-syntax-extensions#lambdacase) - [`LiberalTypeSynonyms`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/explicit-forall#liberaltypesynonyms) - [`MonadComprehensions`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/list-and-comprehension-extensions#monadcomprehensions) - [`MultiWayIf`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/basic-syntax-extensions#multiwayif) - [`NegativeLiterals`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/basic-syntax-extensions#negativeliterals) - [`NPlusKPatterns`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/pattern-and-guard-extensions#npluskpatterns) - [`NondecreasingIndentation`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/basic-syntax-extensions#nondecreasingindentation) - [`NumDecimals`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/basic-syntax-extensions#numdecimals) - [`OverloadedLists`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/list-and-comprehension-extensions#overloadedlists) - [`OverloadedStrings`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/basic-syntax-extensions#overloadedstrings) - [`PackageImports`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/basic-syntax-extensions#packageimports) - [`ParallelListComp`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/list-and-comprehension-extensions#parallellistcomp) - [`PatternGuards`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/pattern-and-guard-extensions#patternguards) - [`PatternSignatures`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/pattern-and-guard-extensions#patternsignatures) - [`PatternSynonyms`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/pattern-and-guard-extensions#patternsynonyms) - [`PolymorphicComponents`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/explicit-forall#rankntypes--rank2types--and-polymorphiccomponents) - [`PostfixOperators`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/basic-syntax-extensions#postfixoperators) - [`Rank2Types`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/explicit-forall#rankntypes--rank2types--and-polymorphiccomponents) - [`RankNTypes`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/explicit-forall#rankntypes--rank2types--and-polymorphiccomponents) - [`RecursiveDo`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/basic-syntax-extensions#recursivedo-and-dorec) - [`ScopedTypeVariables`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/explicit-forall#scopedtypevariables) - [`TransformListComp`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/list-and-comprehension-extensions#transformlistcomp) - [`TupleSections`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/basic-syntax-extensions#tuplesections) - [`UnicodeSyntax`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/basic-syntax-extensions#unicodesyntax) - [`ViewPatterns`](https://www.schoolofhaskell.com/user/PthariensFlame/guide-to-ghc-extensions/pattern-and-guard-extensions#viewpatterns) The following extensions will probably never be covered (usually because they were deprecated and/or removed from GHC sufficiently long ago): - `AlternativeLayoutRule` - `AlternativeLayoutRuleTransitional` - `Generics` - `JavascriptFFI` - `MonoPatBinds` - `NewQualifiedOperators` - `RelaxedLayout` - `SafeImports` Most of the information these tutorials present is derived from [the relevant chapter of the GHC User’s Guide](https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/ghc-language-features.html), as well as selected parts of [the GHC source code](https://github.com/ghc/ghc).
  • Liyang HU

    I love profunctors. They're so easy. 16 Oct 2013Liyang HU

    Covariant functors, contravariant functors, bifunctors and profunctors. Oh my!
  • stevely

    Parsing Floats With Parsec 7 Mar 2013stevely

    In this tutorial we build up a simple parser for floating-point numbers using the Parsec parser combinator library.
  • Joseph Abrahamson

    Basic Lensing 23 Sep 2013Joseph Abrahamson

    No description given.

  • nubis

    Type Families and Pokemon. 16 Mar 2013nubis

    This friendly tutorial will follow the evolution of a program from it's most naive implementation, into a version of the same program which introduces Type Classes, and then finally into it's final form which uses Type Families.
  • Yann Esposito

    Haskell Fast & Hard Yann Esposito

    The SoH Version of Haskell Fast & Hard tutorial. From very beginner up to Monads in a very short and dense tutorial. This tutorial comes from [yannesposito.com](http://yannesposito.com). If you prefer a static version you could always check it [here](http://yannesposito.com/Scratch/en/blog/Haskell-the-Hard-Way), but the ability to interact with the code provides a great way to learn Haskell without installing anything on your computer. Furthermore, the School of Haskell version contains some exercises not present in the original version.
  • Pedro Vasconcelos

    A regular expression matcher 15 Feb 2017Pedro Vasconcelos

    Implementing a simple regular expression matcher using continuations.
  • Michael Snoyman

    Conduit Overview 8 Aug 2016Michael Snoyman

    An introduction to the conduit library, a solution to the streaming data problem.
  • Gabriel Gonzalez

    Sum Types 16 Feb 2013Gabriel Gonzalez

    No description given.