I've looked into comonadic IO before and it seems to me that it isn't actually useful except in very narrow use cases that can barely be described as IO. An example of asynchronous IO as a comonad would be very useful.
> Since he’s forgotten more than I’ll every know about programming, I tend to accept that statement.
This seems to be an unwise principle under which to operate.
> Every monad has an associated comonad which is it’s dual.
I would be very surprised if this was true. Monad and comonad are indeed dual concepts, but that doesn't mean that actual instances of monad have dual comonads and vice versa.
> What that means is, for every monad (which is triple of data type, result function and bind function that obey the monad laws), there exists a triple which has a data type, an extract function and an extend function that obeys the comonad laws.
> Since he’s forgotten more than I’ll every know about programming, I tend to accept that statement.
This seems to be an unwise principle under which to operate.
> Every monad has an associated comonad which is it’s dual.
I would be very surprised if this was true. Monad and comonad are indeed dual concepts, but that doesn't mean that actual instances of monad have dual comonads and vice versa.
> What that means is, for every monad (which is triple of data type, result function and bind function that obey the monad laws), there exists a triple which has a data type, an extract function and an extend function that obeys the comonad laws.
This is a true but trivial statement.