我已经学习了Haskell一段时间,所以我决定检查一些受欢迎的项目,以了解它在现实中的样子,并可能对该过程进行逆向工程。
我选择了哈基尔,因为它做了我熟悉的事情并且中等复杂。然后我立即提出了一个问题:如何回溯进口?
说,在JavaScript中,每个导入都是显式的。
let Q = require("Q") // namespace
let {foo} = require("Q/foo") // value
Haskell默认为
import Q
一次破坏了一切,人们似乎真的滥用它。
现在我看一下tutorial,然后在源头看到我并不知道一个或另一个函数的位置,也不知道除了搜索之外如何发现它。
是否有一些技巧可以发现这种信息,例如发出语法错误,这会泄露源文件或其他什么?您如何在工作流程中解决此类任务?
答案 0 :(得分:6)
一些不需要可编译代码的选项:
我推荐Stackage的数据库,因为它的数据库加载了所有Stackage。
如果您有工作代码:
:i
命令
作为最后两个选项的示例,假设您的模块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。