Skip to content

Instantly share code, notes, and snippets.

@blrobin2
Last active August 29, 2018 19:58
Show Gist options
  • Save blrobin2/5ceca7b51f70622853197e7d4c726236 to your computer and use it in GitHub Desktop.
Save blrobin2/5ceca7b51f70622853197e7d4c726236 to your computer and use it in GitHub Desktop.
Implement join :: M (N (M (N a))) -> M (N a), given distrib :: N (M a) -> M (N a) and assuming M and N are instances of Monad
import qualified Control.Monad as M (join)
-- Not necessarily possible function, but if it is, then joining on Monad stack is possible
distrib :: (Monad m, Monad n) => n (m a) -> m (n a)
distrib = undefined
join :: (Monad m, Monad n) => m (n (m (n a))) -> m (n a)
join mnmna = do
nmna <- mnmna
nna <- distrib nmna
pure . M.join $ nna
-- If n is Traversable too, then `distrib` is just `sequence`
join' :: (Monad m, Monad n, Traversable n) => m (n (m (n a))) -> m (n a)
join' mnmna = do
nmna <- mnmna
nna <- sequence nmna
pure . M.join $ nna
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment