diff --git a/pointfree-fancy.cabal b/pointfree-fancy.cabal
--- a/pointfree-fancy.cabal
+++ b/pointfree-fancy.cabal
@@ -1,32 +1,33 @@
-cabal-version: 2.0
-name: pointfree-fancy
-version: 1.1.1.13
-license: BSD3
-license-file: LICENSE
-maintainer: Vanessa McHale <vamchale@gmail.com>
-author: Thomas Jäger
-tested-with: ghc ==8.0.2 ghc ==8.2.2 ghc ==8.4.4 ghc ==7.10.3
-             ghc ==8.6.4
-synopsis: Tool for refactoring expressions into pointfree form
+cabal-version:      2.0
+name:               pointfree-fancy
+version:            1.1.1.14
+license:            BSD3
+license-file:       LICENSE
+maintainer:         Vanessa McHale <vamchale@gmail.com>
+author:             Thomas Jäger
+tested-with:
+    ghc ==8.0.2 ghc ==8.2.2 ghc ==8.4.4 ghc ==7.10.3 ghc ==8.6.4
+
+synopsis:           Tool for refactoring expressions into pointfree form
 description:
     The pointfree tool is a standalone command-line version of the pl
     plugin for lambdabot.
-category: Tool
-build-type: Simple
+
+category:           Tool
+build-type:         Simple
 extra-source-files:
     ChangeLog
     README
 
 source-repository head
-    type: git
+    type:     git
     location: git://github.com/benmachine/pointfree.git
 
 library
-    exposed-modules:
-        Pointfree
-    hs-source-dirs: lib
+    exposed-modules:  Pointfree
+    hs-source-dirs:   lib
     default-language: Haskell98
-    ghc-options: -Wall
+    ghc-options:      -Wall
     build-depends:
         base -any,
         pointfree-internal -any
@@ -39,32 +40,35 @@
         Plugin.Pl.Optimize
         Plugin.Pl.Rules
         Plugin.Pl.Transform
-    hs-source-dirs: src
+
+    hs-source-dirs:   src
     default-language: Haskell98
-    other-extensions: FlexibleInstances PatternGuards ImplicitParams
-                      ExistentialQuantification FlexibleInstances ScopedTypeVariables
-    ghc-options: -Wall
+    other-extensions:
+        FlexibleInstances PatternGuards ImplicitParams
+        ExistentialQuantification FlexibleInstances ScopedTypeVariables
+
+    ghc-options:      -Wall
     build-depends:
-        base >=4.8 && <5.0,
+        base >=4.9 && <5.0,
         array >=0.3 && <0.6,
         containers >=0.4 && <0.7,
-        haskell-src-exts >=1.20 && <1.21,
+        haskell-src-exts >=1.20 && <1.22,
         transformers <0.6
 
 executable pointfree
-    main-is: Main.hs
+    main-is:          Main.hs
     default-language: Haskell98
-    ghc-options: -Wall
+    ghc-options:      -Wall
     build-depends:
         base >=4.3 && <5.0,
         pointfree-internal -any
 
 test-suite tests
-    type: exitcode-stdio-1.0
-    main-is: Test.hs
-    hs-source-dirs: . test
+    type:             exitcode-stdio-1.0
+    main-is:          Test.hs
+    hs-source-dirs:   . test
     default-language: Haskell98
-    ghc-options: -Wall
+    ghc-options:      -Wall
     build-depends:
         base <5,
         pointfree-internal -any,
diff --git a/src/Plugin/Pl/Common.hs b/src/Plugin/Pl/Common.hs
--- a/src/Plugin/Pl/Common.hs
+++ b/src/Plugin/Pl/Common.hs
@@ -15,6 +15,7 @@
 import           Control.Arrow         (first, second, (&&&), (***), (+++),
                                         (|||))
 import           Control.Monad
+import           Control.Monad.Fail    (MonadFail)
 import           Data.List             (intersperse, minimumBy)
 import qualified Data.Map              as M
 import           Data.Maybe            (fromJust, fromMaybe, isJust)
@@ -122,7 +123,7 @@
 lookupFix :: String -> (Assoc (), Int)
 lookupFix str = fromMaybe (AssocLeft (), 9 + shift) (lookupOp str)
 
-readM :: (Monad m, Read a) => String -> m a
+readM :: (MonadFail m, Monad m, Read a) => String -> m a
 readM s = case [x | (x,t) <- reads s, ("","")  <- lex t] of
             [x] -> return x
             []  -> fail "readM: No parse."
diff --git a/src/Plugin/Pl/Rules.hs b/src/Plugin/Pl/Rules.hs
--- a/src/Plugin/Pl/Rules.hs
+++ b/src/Plugin/Pl/Rules.hs
@@ -611,6 +611,10 @@
   Hard $ rr (\f g -> (compE `a` f) `c` g)
      (\f g -> comp2E `a` f `a` g),
 
+  -- -- f .* (. g) -> f ~@~ g
+  -- rr (\f g -> f `c2` (g `a` compE))
+     -- (\f g -> needleE `a` f `a` g),
+
   -- flip (.) -> (<&>)
   rr (flipE `a` compE)
      eyeE,
diff --git a/test/Test.hs b/test/Test.hs
--- a/test/Test.hs
+++ b/test/Test.hs
@@ -211,6 +211,7 @@
     ["flip (Control.Monad.>>=) . (Control.Applicative.pure .)"],
   unitTest "\\(x, y) -> z" ["const z"],
   unitTest "\\(x, y) -> a" ["const a"],
+  -- unitTest "conj f = \\x -> toA (f $ fromA x)" ["conj = toA ~@~ fromB"],
   unitTest "\\(f, g) x -> (f x, g x)" ["uncurry (&&&)"]
   ]
 
