在Haskell中找到函数源(工作流)

时间:2016-06-22 07:07:03

标签: haskell workflow

我已经学习了Haskell一段时间,所以我决定检查一些受欢迎的项目,以了解它在现实中的样子,并可能对该过程进行逆向工程。

我选择了哈基尔,因为它做了我熟悉的事情并且中等复杂。然后我立即提出了一个问题:如何回溯进口?

说,在JavaScript中,每个导入都是显式的。

let Q = require("Q")         // namespace
let {foo} = require("Q/foo") // value

Haskell默认为

import Q 

一次破坏了一切,人们似乎真的滥用它。

现在我看一下tutorial,然后在源头看到我并不知道一个或另一个函数的位置,也不知道除了搜索之外如何发现它。

是否有一些技巧可以发现这种信息,例如发出语法错误,这会泄露源文件或其他什么?您如何在工作流程中解决此类任务?

3 个答案:

答案 0 :(得分:6)

一些不需要可编译代码的选项:

我推荐Stackage的数据库,因为它的数据库加载了所有Stackage。

如果您有工作代码:

  • 在ghci
  • 中使用:i命令
  • 通过编辑器或命令行使用ghc-mod

作为最后两个选项的示例,假设您的模块Foo.hs如下所示:

module Foo where
import Data.Maybe
...

使用ghci

$ ghci Foo.hs
GHCi, version 7.10.2: http://www.haskell.org/ghc/  :? for help
[1 of 1] Compiling Foo              ( Foo.hs, interpreted )
Ok, modules loaded: Foo.
*Foo> :i catMaybes
catMaybes :: [Maybe a] -> [a]   -- Defined in ‘Data.Maybe’
*Foo>

使用ghc-mod

$ ghc-mod info Foo.hs catMaybes
catMaybes :: [Maybe a] -> [a]   -- Defined in ‘Data.Maybe’
$

答案 1 :(得分:4)

如果你使用Intero for Emacs,它支持标准"转到定义" M-.的捷径。

其他Intero前端也可能使用其编辑器的标准UI来实现此功能;我知道那里已经NeoVim frontend了。

答案 2 :(得分:0)

如果你想在 vim 中使用这种Haskell代码浏览支持,你可以试试Stephen Diehl的精彩教程Vim and Haskell in 2016

Haskell有各种编辑环境,允许您查询GHC编译器以获取有关代码的信息。例如,我使用vim-hdevtools,我可以在 vim 中打开文件hakyll/src/Hakyll/Main.hs,将光标移到Commands.build符号上,输入命​​令{{1}然后GHC将告诉我符号的类型及其定义的位置,并给我选择跳转到定义。

:HdevtoolsInfo

但是,我承认我确实花了很多时间getting vim-hdevtools to work