hlint、hdevtools和ghc-mod有何不同?

11

我正在寻找与vim一起使用的代码lint、类型查询、自动类型插入和其他辅助工具(如自动完成)。在进行了一些研究后,我发现了多个类似的工具,可能可以做到我想要的

  • hlint
  • hdevtools
  • ghc-mod

主要问题是,这些工具基本上都是相同的吗?

当我进行一些测试时,我发现只有ghc-mod能够开箱即用(用于代码lint,还没有尝试任何类型帮助器函数)

$ cat test.hs 
main = putStrLn "test"
$ ghc-mod check test.hs 
test.hs:1:1:Warning: Top-level binding with no type signature: main :: IO ()
$ hdevtools check test.hs 
Run from outside a project, using implicit global project config
$ hlint test.hs 
No hints

我需要为 hlint 和 hdevtools 创建任何配置文件吗?

$ hdevtools --version
hdevtools: version 0.1.4.1 (ghc-8.0.1-x86_64-linux, cabal-1.24.0.0)
$ hlint --version
HLint v1.9.35, (C) Neil Mitchell 2006-2016
$ ghc-mod --version
ghc-mod version 5.6.0.0 compiled by GHC 8.0.1
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 8.0.1
所有工具都是通过 stack install 安装的,而且我已经将/home/wizzup/.local/bin 添加到了$PATH 中。
1个回答

20

ghc-mod 安装了一个名为 ghc-mod 的二进制文件到你的 $PATH 中,它能够加载并查询你的包数据库和源代码(还有一个名为“交互式”的版本叫做 ghc-modi,它从标准输入读取命令并保持运行状态)。它使用 GHC 和 Cabal APIs 来实现这一功能。该项目曾有一段时间的停滞,但现在已经恢复到繁忙的状态。有 Emacs/Vim/Sublime 包知道如何与 ghc-mod 通信,并为最终用户提供各种类似于 IDE 的功能:类型检查、空洞、程序/证明搜索、查找定义。

hdevtools 是一个较新的项目,受到 ghc-mod 的启发而产生。其架构类似——运行一个带有每个编辑器包的持久化后台服务器。它旨在完全替换 ghc-modghc-modhdevtools 之间的区别似乎是哲学上的。 hdevtools 拥有更少的花哨 ghc-mod 特性,但速度(根据我的经验)要快得多。从代码库的粗略一瞥中,有一些引人注目的地方: hdevtools 似乎依赖 GHC API 来实现类似于 GHCi 的服务器,能够快速重新加载代码。也许这是获得良好性能的关键决策?我肯定自己过分简化了。

hlint 是一款非常不同寻常的工具。这是一个古老的项目(由Haskell社区的资深成员之一Neil Mitchell在2006年发起)。它能够检测出典型的坏的Haskell编程习惯(例如,使用concat . map而不是concatMap),并且在某些情况下轻松地对其进行重构。它依赖于将Haskell代码解析成ASTs的haskell-src-exts。我相信hlint甚至不需要对代码库进行完全的类型检查:它可以仅仅查看抽象语法树以提出更改建议和发出警报。您通常会选择ghc-modhdevtools中的其中一种,并与hlint一起使用,以获得完整的Haskell IDE体验。

我们应该在这里花时间提到FP Complete的intero项目,它运行ghci,并类似于hdevtools。但是,它只适用于您的编辑器是Emacs并且您正在使用stack的情况。我无法找到有关它如何与ghc-modhdevtools不同的好文档;我们推测它旨在为Emacs用户提供更好的体验,因为您经常会遇到hdevtools/ghc-mod因编译器或编辑器包不匹配而顽固地拒绝运行的情况。通过使用intero,您可以通过一小段Elisp代码立即启动。

这是一个相当混乱的局面!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接