Getting close to the conceptual metal — January 27, 2020

Writing software can give us the ability to take a nearly impossibly abstract idea and use it to create a runnable program.

In this post we’re to talk about “fundamental things” and see how much we can build with them.

type a × b =
  forall c.
    (a -> b -> c) -> c

type a + b =
  forall c.
    (a -> c) -> (b -> c) -> c

Deploying a fully automated Nix-based static website — November 21, 2019

{ config, pkgs, ... }:
  repo = builtins.fetchTarball {
    url = https://repo.tar.gz;
  imports = ["${repo}/module.nix"];

  services."site".enable = true;

I can’t promise that this will take you five minutes (it won’t). What I will say is this: if you’d like to learn more about Nix and NixOs then this may be interesting.

Servant's type-level domain specific language — October 5, 2019

Haskell has some very interesting type-level features, Servant is a great case-study in how they can be used to build a practical and feature rich library. This post walks through an example in an attempt to become more familiar with its inner workings.

type UsersIndex =
  Get '[JSON] [User]

type UsersShow =
  Capture "username" String
    :> Get '[JSON] User

type UsersAPI =
    :> (UsersIndex :<|> UsersShow)

Let's learn about lenses — August 21, 2018

type Lens s t a b =
  forall f. Functor f =>
    (a -> f b) -> s -> f t

_1 :: Lens (a, c) (b, c) a b
_1 = _

_2 :: Lens (c, a) (c, b) a b
_2 = _

Gaining an understanding of the Lens type has been on my todo list for a long time. So I finally bit the bullet and read up a little. These are (more or less) my notes as I went along.

You already know what Monads are — January 6, 2017

I sought to understand what the fuss was all about and I’ve now added to the mass of Monad Explainer posts on the internet.

readAFile().then(function (content) {
  return writeAFile(content)
}).then(function (report) {