diff --git a/Control/Lens/SemiIso.hs b/Control/Lens/SemiIso.hs
--- a/Control/Lens/SemiIso.hs
+++ b/Control/Lens/SemiIso.hs
@@ -63,6 +63,7 @@
     constant,
     exact,
     bifiltered,
+    alwaysFailing,
 
     -- * Semi-isos for numbers.
     _Negative,
@@ -192,6 +193,10 @@
 bifiltered p = semiIso check check
   where check x | p x       = Right x
                 | otherwise = Left "bifiltered: predicate failed"
+
+-- | A semi-iso that fails in both directions.
+alwaysFailing :: String -> SemiIso s t a b
+alwaysFailing msg = semiIso (\_ -> Left msg) (\_ -> Left msg)
 
 -- | \-> Matches only negative numbers, turns it into a positive one.
 --
diff --git a/Data/SemiIsoFunctor.hs b/Data/SemiIsoFunctor.hs
--- a/Data/SemiIsoFunctor.hs
+++ b/Data/SemiIsoFunctor.hs
@@ -117,6 +117,10 @@
 
     {-# MINIMAL (siunit | sipure), (/*/) #-}
 
+-- | Fails with a message.
+sifail :: SemiIsoApply f => String -> f a
+sifail msg = alwaysFailing msg /$/ siunit
+
 -- | Equivalent of 'Alternative' for 'SemiIsoFunctor'.
 --
 -- @f a@ should form a monoid with identity 'siempty' and binary
diff --git a/semi-iso.cabal b/semi-iso.cabal
--- a/semi-iso.cabal
+++ b/semi-iso.cabal
@@ -1,5 +1,5 @@
 name:                semi-iso
-version:             0.4.0.0
+version:             0.4.1.0
 synopsis:            Weakened partial isomorphisms that work with lenses.
 description:         Semi-isomorphisms are partial isomorphisms with weakened iso laws.
                      And they work with Iso and Prism from @lens@!
