# Using Hoogle to Search for Haskell Functions

### An easy way to use Hoogle from bash to search for functions in Haskell.

## 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 a 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]`

Also, again it isn’t sufficient, in light of the fact that it shows just documentation of first capacity from the rundown. We need to move a counter to see documentation of additional capacities, e. g. to show information about third thing from the rundown:

`$ 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 bulky to check each time you need to peruse data about additional capacities, so I have arranged slam work which makes it simpler.

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.