HTTP client in Haskell
To try to make sense of this, I decided to write a "simple" http client in Haskell in as many styles as I could think of:
import Network.HTTP
import Control.Applicative
url = "http://www.haskell.org/haskellwiki/Haskell"
-- Imperative style
fetch_1 = do
rsp <- Network.HTTP.simpleHTTP (getRequest url)
body <- getResponseBody rsp
return (take 1000 body)
-- With Functors' fmap
fetch_2 = do
rsp <- Network.HTTP.simpleHTTP (getRequest url)
fmap (take 1000) (getResponseBody rsp)
-- With Applicative's >>=
fetch_3 = fmap (take 1000) (Network.HTTP.simpleHTTP (getRequest url) >>= getResponseBody)
-- "fmap f x" is the same as "pure f <*> x" (Applicative's law)
fetch_4 = pure (take 1000) <*> (Network.HTTP.simpleHTTP (getRequest url) >>= getResponseBody)
-- "pure f <*> x" is the same as "f <$> x"
fetch_5 = (take 1000) <$> (Network.HTTP.simpleHTTP (getRequest url) >>= getResponseBody)
It's a long time since I found so many new concepts while studying a new programming language...