Hoogle 和 yesod - 如何在非默认包中轻松找到函数

Hoogle and yesod - how to easily find functions in non-default packages

我使用 stack install hoogle 安装了 hoogle。现在我可以使用这样的命令从 stack ghci:

中搜索函数
:!hoogle --count=15 "[a] -> a"

我在我的 Yesod 项目的根目录中 - 我安装它的主要原因是为了获得 Yesod 函数的帮助 - 但是当我试图从 Yesod 中找到一个函数时,比如 addHeader,它没有'无法识别 Yesod 上定义的类型:

:t addHeader
addHeader :: MonadHandler m => Text -> Text -> m ()
:!hoogle --count=15 "MonadHandler m => Text -> Text -> m ()"
Warning: Unknown class MonadHandler
.
.
.

我如何设置 hoogle 以与 Yesod 以及我正在从事的这个项目一起完美地工作,以便 hoogle 能够带来我自己的功能和 Yesod 的功能?

您需要先获取 Hoogle 来创建一个 yesod-core 数据库:

λ> :!hoogle data yesod-core
0 warnings, saved to .warnings
Data generation complete

那么就可以了!

λ> :!hoogle "+yesod-core MonadHandler m => Text -> Text -> m ()"
Yesod.Core.Handler addHeader :: MonadHandler m => Text -> Text -> m ()
Yesod.Core.Handler deleteCookie :: MonadHandler m => Text -> Text -> m ()
Yesod.Core.Handler setHeader :: MonadHandler m => Text -> Text -> m ()
Yesod.Core.Handler setSession :: MonadHandler m => Text -> Text -> m ()
Yesod.Core.Widget toWidgetMedia :: (ToWidgetMedia site a, MonadWidget m, HandlerSite m ~ site) => Text -> a -> m ()
Yesod.Core.Json (.=) :: KeyValue kv => forall v. ToJSON v => Text -> v -> kv

糟糕,+yesod-core 标签不太好。幸运的是,我们可以 combine our Hoogle databases into one big one:

$ cd ~/.stack/snapshots/x86_64-osx/lts-5.8/7.10.3/share/x86_64-osx-ghc-7.10.3/hoogle-4.2.43/databases 
$ mv default.hoo{,-prev}
$ hoogle combine *.hoo

(您的数据库路径会有所不同,具体取决于您是 stack installed 还是 cabal installed。)

λ> :!hoogle "addHeader"
Yesod.Core.Handler addHeader :: MonadHandler m => Text -> Text -> m ()
Network.CGI.Monad cgiAddHeader :: MonadCGI m => HeaderName -> String -> m ()

比 Google 好多了。