module Functions where j :: Monad m => m (m a) -> m a j = flip (>>=) id l1 :: Monad m => (a -> b) -> m a -> m b l1 = fmap l2 :: Monad m => (a -> b -> c) -> m a -> m b -> m c l2 f xs ys = f <$> xs <*> ys a :: Monad m => m a -> m (a -> b) -> m b a xs f = f <*> xs meh :: Monad m => [a] -> (a -> m b) -> m [b] meh xs f = rec $ fmap f xs where rec [] = return [] rec (x:xs) = (:) <$> x <*> (rec xs) flipType :: Monad m => [m a] -> m [a] flipType = flip meh id