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