Are all differentiable types Monads
deriving, haskell, monads, zipper
Solution
No. The void functor `data V a` is differentiable, but `return` cannot be implemented for it.
Problem
Given a differentiable type, we know that its `Zipper` is a `Comonad`. In response to this, Dan Burton asked, "If derivation makes a comonad, does that mean that integration makes a monad? Or is that nonsense?". I'd like to give this question a specific meaning. If a type is differentiable, is it necessarily a monad? One formulation of the question would be to ask, given the following definitions ``` data Zipper t a = Zipper { diff :: D t a, here :: a } deriving instance Diff t => Functor (Zipper t) class (Functor t, Functor (D t)) => Diff t where type D t :: * -> * up :: Zipper t a -> t a down :: t a -> t (Zipper t a) ``` can we write functions with signatures similar to ``` return :: (Diff t) => a -> t a (>>=) :: (Diff t) => t a -> (a -> t b) -> t b ``` obeying the Monad laws. In the answers to the linked questions, there were two successful approaches to a similar problem of deriving `Comonad` instances for the `Zipper`. The first approach was to expand the `Diff` class to include the dual of `>>=` and use partial differentiation. The second approach was to require that the type be twice or infinitely differentiable.