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.