You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.1 KiB
58 lines
1.1 KiB
module Functions where |
|
|
|
-- 1 |
|
j :: Monad m => m (m a) -> m a |
|
j x = x >>= id |
|
|
|
-- 2 |
|
l1 :: Monad m => (a -> b) -> m a -> m b |
|
-- without fmap |
|
l1 f x = do |
|
a' <- x |
|
return $ f a' |
|
l1 f x = x >>= (return . f) |
|
-- with fmap :) |
|
-- l1 = fmap |
|
|
|
-- 3 |
|
l2 :: Monad m => (a -> b -> c) -> m a -> m b -> m c |
|
-- without fmap |
|
l2 f x y = do |
|
a' <- x |
|
b <- y |
|
return $ f a' b |
|
-- l2 f x y = x >>= (\a -> y >>= \b -> return $ f a b) |
|
-- with fmap |
|
-- l2 f x y = (fmap f x) <*> y |
|
|
|
-- 4 |
|
a :: Monad m => m a -> m (a -> b) -> m b |
|
-- without fmap |
|
a x fs = do |
|
a' <- x |
|
f <- fs |
|
return $ f a' |
|
-- with fmap |
|
-- a x fs = do |
|
-- f <- fs |
|
-- fmap f x |
|
-- a x fs = fs >>= \y -> fmap y x |
|
-- a x fs = fs <*> x |
|
|
|
-- 5 |
|
meh :: Monad m => [a] -> (a -> m b) -> m [b] |
|
meh [] _ = return [] |
|
meh (x:xs) f = do |
|
b <- f x |
|
fmap (b:) $ meh xs f |
|
-- using flipType as base |
|
-- meh as f = flipType (fmap f as) |
|
|
|
-- 6 |
|
flipType :: (Monad m) => [m a] -> m [a] |
|
flipType = flip meh id |
|
-- and without using meh |
|
-- flipType [] = return [] |
|
-- flipType (x:xs) = do |
|
-- x' <- x |
|
-- fmap (x':) $ flipType xs |