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.
No. The void functor data V a
is differentiable, but return
cannot be implemented for it.