diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.0.4.2
+
+* Add documentation for `Handle`
+
 ## 0.0.4.0
 
 * Add functions for compound effects
diff --git a/bluefin-internal.cabal b/bluefin-internal.cabal
--- a/bluefin-internal.cabal
+++ b/bluefin-internal.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.0
 name:               bluefin-internal
-version:            0.0.4.0
+version:            0.0.4.2
 license:            MIT
 license-file:       LICENSE
 author:             Tom Ellis
diff --git a/src/Bluefin/Internal.hs b/src/Bluefin/Internal.hs
--- a/src/Bluefin/Internal.hs
+++ b/src/Bluefin/Internal.hs
@@ -199,7 +199,46 @@
 -- @()@ and then yields values of type @a@.
 type Stream a = Coroutine a ()
 
+-- | You can define a @Handle@ instance for your compound handles.  As
+-- an example, an "application" handle with a dynamic effect for
+-- database queries, a concrete effect for application state and a
+-- concrete effect for a logging effect might look like this:
+--
+-- @
+-- data Application e = MkApplication
+--   { queryDatabase :: String -> Int -> Eff e [String],
+--     applicationState :: State (Int, Bool) e,
+--     logger :: Stream String e
+--   }
+-- @
+--
+-- To define @mapHandle@ for @Application@ you should apply
+-- @mapHandle@ to all the fields that are themeselevs handles and
+-- apply @useImpl@ to all the fields that are dynamic effects:
+--
+-- @
+-- instance Handle Application where
+--   mapHandle
+--     MkApplication
+--       { queryDatabase = q,
+--         applicationState = a,
+--         logger = l
+--       } =
+--       MkApplication
+--         { queryDatabase = (fmap . fmap) useImpl q,
+--           applicationState = mapHandle a,
+--           logger = mapHandle l
+--         }
+-- @
+--
+-- Note that preceding @useImpl@ on the dynamic effect there is one
+-- fmap per @->@ that appears in type of the dynamic effect.  That is,
+-- @queryDatabase@ has type @String -> Int -> Eff e [String]@, which
+-- has two @->@, so there are two @fmap@s before @useImpl@.
+
 class Handle (h :: Effects -> Type) where
+  -- | Used to create compound effects, i.e. handles that contain
+  -- other handles.
   mapHandle :: (e :> es) => h e -> h es
 
 instance Handle (State s) where
@@ -914,6 +953,9 @@
 tell (Writer y) = yield y
 
 newtype Reader r (e :: Effects) = MkReader r
+
+instance Handle (Reader r) where
+  mapHandle (MkReader r) = MkReader r
 
 runReader ::
   -- | ͘
diff --git a/src/Bluefin/Internal/Examples.hs b/src/Bluefin/Internal/Examples.hs
--- a/src/Bluefin/Internal/Examples.hs
+++ b/src/Bluefin/Internal/Examples.hs
@@ -576,3 +576,24 @@
 -- Left "/tmp/doesn't exist: openFile: does not exist (No such file or directory)"
 -- \$ cat /tmp/bluefin
 -- Hello!
+
+-- instance Handle example
+
+data Application e = MkApplication
+  { queryDatabase :: String -> Int -> Eff e [String],
+    applicationState :: State (Int, Bool) e,
+    logger :: Stream String e
+  }
+
+instance Handle Application where
+  mapHandle
+    MkApplication
+      { queryDatabase = q,
+        applicationState = a,
+        logger = l
+      } =
+      MkApplication
+        { queryDatabase = (fmap . fmap) useImpl q,
+          applicationState = mapHandle a,
+          logger = mapHandle l
+        }
