In "Data types a la carte" Swierstra writes that given Free (which he calls Term) and Zero you can implement the Identity monad:
data Term f a = Pure a
| Impure (f (Term f a))
data Zero a
Term Zero is now the Identity monad. I understand why this is. The issue is that I can never use Term Zero as a Monad because of the pesky Functor f => constraint:
instance Functor f => Monad (Term f) where
return x = Pure x
(Pure x) >>= f = f x
(Impure f) >>= t = Impure (fmap (>>=f) t)
How do I make Zero a Functor?
instance Functor Zero where
fmap f z = ???
It seems like there's a trick here: Since Zero has no constructors, Impure can never be used, and so the Impure case of >>= is never called. This means fmap is never called, so there's a sense in which this is ok:
instance Functor Zero where
fmap f z = undefined
The problem is, this feels like cheating. What am I missing? Is Zero actually a Functor? Or perhaps Zero isn't a Functor, and this is a shortcoming of how we express Free in Haskell?