@Matthew,

after taking away the functional dependencies, and changing the definitions of both adjunctions (`catLeftAdjunct` was missing a `runKleisli`) I have finally got:

instance Monad m => CatAdjunction (->) (Kleisli m) LeftK (RightK m) where

catLeftAdjunct f = RightK . runKleisli f . LeftK

catRightAdjunct f = Kleisli $ unRightK . f . unLeftK

By the way, as `LeftK` is the just the `Identity` and `RightK m` is just `m` functor, I think one can simplify **puzzle 3** to:

newtype Identity a = Identity { runIdentity :: a } -- I do not use Data.Functor.Identity because its functor instance

-- overlaps with the EndoFunctor's one.

instance Monad m => CatFunctor (->) Identity (Kleisli m) where

catMap = Kleisli . (pure .) . fmap

instance Monad m => CatFunctor (Kleisli m) m (->) where

catMap (Kleisli f) ma = ma >>= f

instance Monad m => CatAdjunction (->) (Kleisli m) Identity m where

catLeftAdjunct f = runKleisli f . Identity

catRightAdjunct f = Kleisli $ f . runIdentity

And that's all (I think).

after taking away the functional dependencies, and changing the definitions of both adjunctions (`catLeftAdjunct` was missing a `runKleisli`) I have finally got:

instance Monad m => CatAdjunction (->) (Kleisli m) LeftK (RightK m) where

catLeftAdjunct f = RightK . runKleisli f . LeftK

catRightAdjunct f = Kleisli $ unRightK . f . unLeftK

By the way, as `LeftK` is the just the `Identity` and `RightK m` is just `m` functor, I think one can simplify **puzzle 3** to:

newtype Identity a = Identity { runIdentity :: a } -- I do not use Data.Functor.Identity because its functor instance

-- overlaps with the EndoFunctor's one.

instance Monad m => CatFunctor (->) Identity (Kleisli m) where

catMap = Kleisli . (pure .) . fmap

instance Monad m => CatFunctor (Kleisli m) m (->) where

catMap (Kleisli f) ma = ma >>= f

instance Monad m => CatAdjunction (->) (Kleisli m) Identity m where

catLeftAdjunct f = runKleisli f . Identity

catRightAdjunct f = Kleisli $ f . runIdentity

And that's all (I think).