Haskell for all
A blog about Haskell and functional programming
HaskellFunctional / PL theoryAI / MLDev tools / editors / IDEs
- Posts
- 205 from 31 Dec 2011 to 2 Sep 2026
- Posting
- monthly (13 in the last year)
- Kind
- personal blog
- Feed
- https://haskellforall.com/rss.xml
2026 13
- Dependent if expressions without dependent types
- Mechanized type inference for record concatenation
- Record type inference for dummies
- Ergonomic overrides for Nixpkgs
- Type out the code
- A bidirectional typechecking puzzle
- A sufficiently detailed spec is code
- Browse code by meaning
- Beyond agentic coding
- My experience with vibe coding
- Type-safe eval in Grace
- Chat is the least interesting interface to LLMs
- Prompting 101: Show, don’t tell
2025 4
2024 9
- The Haskell inlining and specialization FAQ
- Firewall rules: not as secure as you think
- Software engineers are not (and should not be) technicians
- Quality and productivity are not necessarily mutually exclusive
- My spiciest take on tech hiring
- Prefer do notation over Applicative operators when assembling records
- All error messages are necessarily bad to some degree
- The siren song of domain-specific languages
- Unification-free ("keyword") type checking
2023 7
- A GHC plugin for OpenTelemetry build metrics
- My views on NeoHaskell
- GHC plugin for HLint
- Ergonomic newtypes for Haskell strings and numbers
- The "open source native" principle for software design
- terraform-nixos-ng: Modern terraform support for NixOS
- Announcing nixos-rebuild: a "new" deployment tool for NixOS
2022 18
- Nixpkgs support for Linux builders running on macOS
- Nixpkgs support for incremental Haskell builds
- How to correctly cache build-time dependencies using Nix
- What does "isomorphic" mean (in Haskell)
- nix-serve-ng: A faster, more reliable, drop-in replacement for nix-serve
- Stop calling everything "Nix"
- Incrementally package a Haskell program using Nix
- defaultable-map: An Applicative wrapper for Maps
- The appeal of bidirectional type-checking
- Generate web forms from pure functions
- The golden rule of software distributions
- Why does Haskell's take function accept insufficient elements?
- Introductory resources to type theory for language implementers
- Modeling PlusCal in Haskell using Cartesian products of NFAs
- The hard part of type-checking Nix
- Applicatives should usually implement Semigroup and Monoid
- What is a monad morphism (in Haskell)?
- Nixpkgs overlays are monoids
2021 17
- Funding isn't the problem with open source
- Co-Applicative programming style
- Advice for aspiring bloggers
- The "return a command" trick
- Fall-from-Grace: A ready-to-fork functional programming language
- Optics are monoids
- Forward and reverse proxies explained
- Naming function arguments in Dhall
- Namespaced De Bruijn indices
- Probability for Slay the Spire fanatics
- Module organization guidelines for Haskell projects
- The trick to avoid deeply-nested error-handling code
- The end of history for programming
- How to replace Proxy with AllowAmbiguousTypes
- Folds are constructor substitution
- Dynamic type errors lack relevance
- The visitor pattern is essentially the same thing as Church encoding
2020 10
- Recruiting for diversity is not lowering the bar
- How to use NixOS for lightweight integration tests
- Pretty-print syntax trees with this one simple trick
- Why I prefer functional programming
- The golden rule of software quality
- Record constructors
- Blazing fast Fibonacci numbers using Monoids
- Dhall Survey Results (2019-2020)
- Why Dhall advertises the absence of Turing-completeness
- Dhall - Year in review (2019-2020)
2019 6
2018 6
2017 12
- Compare Nix derivations using nix-diff
- Semantic integrity checks are the next generation of semantic versioning
- Advice for Haskell beginners
- Why do our programs need to read input and write output?
- Type-driven strictness
- Demystifying Haskell assignment
- Dhall is now a template engine
- Translating a C++ parser to Haskell
- Use Dhall to configure Bash programs
- The Curry-Howard correspondence between programs and proofs
- Program JSON and YAML with Dhall
- Typed Nix programming using Dhall
2016 11
- Dhall - A non-Turing-complete configuration language
- Electoral vote distributions are Monoids
- Auto-generate service API endpoints from records
- list-transformer - A beginner-friendly ListT
- A command-line benchmark tool
- Data is Code
- Worst practices should be hard
- LambdaConf should reconsider its policy
- Auto-generate a command line interface from a data type
- State of the Haskell Ecosystem - February 2016 Edition
- From mathematics to map-reduce
2015 17
- Compile-time memory safety using Liquid Haskell
- How to contribute to the Haskell ecosystem
- Interactive and composable charts
- Haskell-native spreadsheets
- Explicit is better than implicit
- Basic Haskell Examples
- Polymorphism for dummies
- How to make your Haskell code more readable to non-Haskell programmers
- State of the Haskell ecosystem - August 2015
- break-1.0.0: A small library for breaking from loops
- optional-args-1.0.0: Optional function arguments
- The internet of code
- Haskell content spinner
- Mathematical APIs
- Algebraic side effects
- Use Haskell for shell scripting
- total-1.0.0: Exhaustive pattern matching using traversals, prisms, and lenses
2014 18
- A very general API for relational joins
- How to build library-agnostic streaming sources
- How to desugar Haskell code
- Morte: an intermediate language for super-optimizing functional programs
- managed-1.0.0: A monad for managed resources
- Equational reasoning at scale
- Spreadsheet-like programming in Haskell
- Model-view-controller, Haskell-style
- How the continuation monad works
- Scalable program architectures
- Worst practices are viral for the wrong reasons
- Introductions to advanced Haskell topics
- How to model handles with pipes
- Reasoning about stream programming
- pipes-http-1.0: Streaming HTTP/HTTPS clients
- pipes-parse-3.0: Lens-based parsing
- Streaming logging
- Shortcut fusion for pipes
2013 26
- Equational reasoning
- Lift error handling with lens-like syntax
- Test stream programming using Haskell's `QuickCheck`
- An all-atom protein search engine powered by Haskell
- How to reimplement the conduit parsing API in 50 lines of pipes code
- Manual proofs for the `pipes` laws
- Perfect streaming using `pipes-bytestring`
- pipes-4.0: Simpler types and API
- foldl-1.0.0: Composable, streaming, and efficient left folds
- Composable streaming folds
- Sometimes less is more in language design
- Statements vs Expressions
- The Resource Monad
- From zero to cooperative threads in 33 lines of Haskell code
- pipes-concurrency-1.2.0: Behaviors and broadcasts
- pipes-parse-1.0.0: Pushback, delimited parsers, resumable parsing, and lenses
- pipes-3.3.0: Folds and uniting ListT with Proxy
- Program imperatively using Haskell lenses
- pipes and io-streams
- pipes-concurrency-1.0.0: Reactive programming
- Defaults
- pipes-3.2: ListT, Codensity, ArrowChoice, and performance
- mmorph-1.0.0: Monad morphisms
- Comonads are objects
- Introduction to Haskell IO
- pipes-safe-1.0 - Resource management and exception handling for pipes
2012 30
- The Continuation Monad
- pipes-3.0 - A simpler, unified API
- pipes-2.5: Faster and slimmer
- "Hello, core!"
- Parsing chemical substructures
- pipes-2.4: Proxy transformers, extra categories, utilities, and benchmarks
- The MonadTrans class is missing a method
- The functor design pattern
- Concurrency = Lists of Kleisli arrows
- pipes-2.3 - Bidirectional pipes
- The category design pattern
- Code Example #1
- Free monad transformers
- First-class modules without defaults
- Purify code using free monads
- Breaking from a loop
- errors-1.0: Simplified error handling
- pipes-2.1 and index-core-1.0 - Indexed types
- Gadts
- Why free monads matter
- Conduit bugs
- pipes 2.0 - Pipe Finalization
- Scrap your type classes
- Haskell for Purists - Pipe Finalization
- Haskell for Java Programmers - Serialization
- Haskell for Engineers - Unicode
- Haskell for mainstream programmers 28
- Haskell for Mainstream Programmers - State
- Haskell for Intermediate Programmers - Algebraic Data Types
- Haskell for C Programmers - For Loops