## What is `Hoogle`

?

Hoogle is Google for searching of Haskell functions. You could ask it for function name or its signature.

There is available command `hoogle`

, which could be installed using `stack`

:

$ stack install hoogle

## Using `hoogle`

from command line

To `hoogle`

a function you could just pass it as parameter:

$ hoogle fmap Prelude fmap :: Functor f => (a -> b) -> f a -> f b Data.Functor fmap :: Functor f => (a -> b) -> f a -> f b Control.Monad fmap :: Functor f => (a -> b) -> f a -> f b Control.Monad.Instances fmap :: Functor f => (a -> b) -> f a -> f b Data.Traversable fmapDefault :: Traversable t => (a -> b) -> t a -> t b Network.Stream fmapE :: (a -> Result b) -> IO (Result a) -> IO (Result b)

or pass its signature:

$ hoogle "(a -> b -> c) -> [a] -> [b] -> [c]" Prelude zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] Data.List zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] Control.Applicative liftA2 :: Applicative f => (a -> b -> c) -> f a -> f b -> f c Control.Monad liftM2 :: Monad m => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r Prelude scanl :: (a -> b -> a) -> a -> [b] -> [a] Data.List scanl :: (a -> b -> a) -> a -> [b] -> [a] Prelude scanr :: (a -> b -> b) -> b -> [a] -> [b] Data.List scanr :: (a -> b -> b) -> b -> [a] -> [b] Data.List deleteFirstsBy :: (a -> a -> Bool) -> [a] -> [a] -> [a] Data.List intersectBy :: (a -> a -> Bool) -> [a] -> [a] -> [a] ...

But it shows only list of the signatures of the functions. Sometimes we want to see more information about function. If you use option `-i`

, then additional information will be shown:

$ hoogle -i "(a -> b -> c) -> [a] -> [b] -> [c]" Prelude zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] zipWith generalises zip by zipping with the function given as the first argument, instead of a tupling function. For example, zipWith (+) is applied to two lists to produce the list of corresponding sums. From package base zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]

And again it is not enough, because it shows only documentation of first function from the list. We have to move a counter to see documentation of further functions, e. g. to show information about third item from the list:

$ hoogle -i -s 3 "(a -> b -> c) -> [a] -> [b] -> [c]" Control.Applicative liftA2 :: Applicative f => (a -> b -> c) -> f a -> f b -> f c Lift a binary function to actions. From package base liftA2 :: Applicative f => (a -> b -> c) -> f a -> f b -> f c

## Easier `hoogle`

usage in `bash`

It is cumbersome to count each time you want to read info about further functions, so I have prepared bash function which makes it easier.

To search for function type:

$ hoog "(a->b) -> f a -> f b" 1) Data.Traversable fmapDefault :: Traversable t => (a -> b) -> t a -> t b 2) Prelude fmap :: Functor f => (a -> b) -> f a -> f b 3) Data.Functor fmap :: Functor f => (a -> b) -> f a -> f b 4) Control.Monad fmap :: Functor f => (a -> b) -> f a -> f b 5) Control.Monad.Instances fmap :: Functor f => (a -> b) -> f a -> f b 6) Data.Functor (<$>) :: Functor f => (a -> b) -> f a -> f b 7) Control.Applicative (<$>) :: Functor f => (a -> b) -> f a -> f b

Each function will have its counter at the beginning and just add its number at the end of command to show more information about specific function:

$ hoog "(a->b) -> f a -> f b" 6 Searching for: (a -> b) -> f a -> f b Data.Functor (<$>) :: Functor f => (a -> b) -> f a -> f b An infix synonym for fmap. From package base (<$>) :: Functor f => (a -> b) -> f a -> f b

## How to install `hoog`

command?

Command is available here. To use this command just add it to your `~/bashrc`

file.