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

Iva*_*nin 6 workflow haskell

我正在学习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)

它会立刻破坏一切,人们似乎真的滥用它.

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

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

Eri*_*ikR 7

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

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

如果你有工作代码:

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

作为最后两个选项的示例,假设您有一个模块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)