diff --git a/horizon.dhall b/horizon.dhall
index 4f92a20e1782bd660a162895a8872cf74d3ca25b..bb934324bd7cfe6aff8e10f110290411e72c357a 100644
--- a/horizon.dhall
+++ b/horizon.dhall
@@ -4,6 +4,7 @@ let H =
 let packages =
       { formatting = H.callHackage "formatting" "7.2.0"
       , polysemy = H.callHackage "polysemy" "1.9.1.0"
+      , recursion-schemes = H.callHackage "recursion-schemes" "5.2.2.4"
       , type-errors = H.callHackage "type-errors" "0.2.0.2"
       , unagi-chan = H.callHackage "unagi-chan" "0.4.1.4"
       }
diff --git a/horizon.lock b/horizon.lock
index b2e819c6bdc19cdc7a74b325d5a699cde63ace00..a857d54c8cfbc9c7e79cbd582f88508c6e67c9a0 100644
--- a/horizon.lock
+++ b/horizon.lock
@@ -6,6 +6,10 @@
   , mapValue =
       "b134fcf0c950011e7c4bb8c074b99f70b11d26de8db9fa05db498008dae61cdb"
   }
+, { mapKey = "recursion-schemes"
+  , mapValue =
+      "4fd1545bb00d723c31149fa5266684bf89be3e3765c0c6229b80d18ef8529ea4"
+  }
 , { mapKey = "type-errors"
   , mapValue =
       "9a6f7b5c1c3b6f5641d84da2df9661c507251df438da179a9926941422e31bc1"
diff --git a/overlay.nix b/overlay.nix
index dbd6fd45bf0a488ae2aafb344cbb25917770ec14..b1c08741d5a7d9e79e2822396a14a37d131a0287 100644
--- a/overlay.nix
+++ b/overlay.nix
@@ -5,6 +5,8 @@ final: prev: with pkgs.haskell.lib; {
 
   polysemy = final.callPackage (./pkgs/polysemy.nix) { };
 
+  recursion-schemes = final.callPackage (./pkgs/recursion-schemes.nix) { };
+
   type-errors = final.callPackage (./pkgs/type-errors.nix) { };
 
   unagi-chan = final.callPackage (./pkgs/unagi-chan.nix) { };
diff --git a/pkgs/recursion-schemes.nix b/pkgs/recursion-schemes.nix
new file mode 100644
index 0000000000000000000000000000000000000000..f36d721295d2f6933bf18950560b0c0caf45e9ba
--- /dev/null
+++ b/pkgs/recursion-schemes.nix
@@ -0,0 +1,30 @@
+{ mkDerivation, HUnit, base, base-orphans, comonad, containers
+, data-fix, free, lib, template-haskell, th-abstraction
+, transformers
+}:
+mkDerivation {
+  pname = "recursion-schemes";
+  version = "5.2.2.4";
+  sha256 = "0c151bc90a9a28bab2beced0e450103e102f754ddfebb8f924fc8a3b11c4db43";
+  revision = "2";
+  editedCabalFile = "1617jz77d4f2hf54jfz30zbf18rcgl6h0nzn3rcl0gjxjavf5aq6";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    base base-orphans comonad containers data-fix free template-haskell
+    th-abstraction transformers
+  ];
+  testHaskellDepends = [ base HUnit template-haskell transformers ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "http://github.com/ekmett/recursion-schemes/";
+  description = "Representing common recursion patterns as higher-order functions";
+  license = lib.licenses.bsd2;
+  broken = false;
+}
\ No newline at end of file