import Prelude hiding ((.)) import Control.Category ((.), (<<<), (>>>), Category) data InvertibleFunction a b = InvertibleFunction (a -> b) (b -> a) instance Category InvertibleFunction where (InvertibleFunction b_c c_b) . (InvertibleFunction a_b b_a) = InvertibleFunction (b_c . a_b) (b_a . c_b) inv (InvertibleFunction x y) = InvertibleFunction y x add :: (Num n) => n -> InvertibleFunction n n add x = InvertibleFunction (+x) (\y -> y - x) class KindaApplicative f where (<$>) :: f a b -> a -> b instance KindaApplicative InvertibleFunction where (InvertibleFunction f _) <$> x = f x main = print $ ((inv (add 2)) <$> 5)