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

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

我选择了Hakyll,因为它做了我熟悉的事情,并且适度复杂。 然后我马上回答了这个问题:如何回溯进口?

说,在JavaScript中,每个导入都是明确的。

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

Haskell默认为

import Q 

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

现在我看看教程,然后在源文件中,意识到我不知道在哪里找到一个或另一个函数,也不知道如何发现它,除了搜索。

是否有一些技巧来发现这种信息,如制作语法错误,这将显示源文件或其他? 你如何解决你的工作流程中的这些任务?


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

  • 使用hayoo
  • 在Stackage.org使用hoogle
  • 我推荐Stackage的hoogle,因为它的数据库加载了所有的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’
    $
    

    如果您使用Intero for Emacs,则它支持M-.的标准“定义”快捷键M-.

    其他Intero前端也可能使用其编辑器的标准UI来实现此功能; 我知道这里有一个NeoVim前端。


    如果你想在vim中使用这种Haskell代码浏览支持,你可以在2016年尝试Stephen Diehl的漂亮教程Vim和Haskell。

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

    Commands.build ::
      Config.Configuration -> Logger.Logger -> Rules a -> IO ExitCode
            -- Defined at hackyll/src/Hakyll/Commands.hs:48:1
    

    但是,我承认我花了很多时间让vim-hdevtools工作。

    链接地址: http://www.djcxy.com/p/80779.html

    上一篇: Find function source in Haskell (workflow)

    下一篇: Is there a nice way to make function signatures more informative in Haskell?