hlint,hdevtools和ghc-mod有什么不同

时间:2016-10-19 12:26:59

标签: haskell

我正在寻找代码lint,类型查询,自动类型插入和misc帮助器与vim一起使用(如自动完成)。

经过一些研究后,我发现了多个类似的工具,可以让我们按照自己的意愿行事。

  • hlint
  • hdevtools
  • ghc-mod

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

当我做一些测试时,我发现只有ghc-mod才能开箱即用(对于代码lint,havn&tt尝试任何Type-helper函数)

$ 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 个答案:

答案 0 :(得分:18)

ghc-mod将一个名为ghc-mod的二进制文件安装到您的$PATH,它可以加载和查询您的包数据库和源代码(还有一个" interactive"名为ghc-modi的版本,从标准输入读取命令并粘贴在其​​中。它使用GHC和Cabal API来实现。进展停滞了一段时间,但现在又回到了繁华的状态。 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代码解析为AST的haskell-src-exts。我相信hlint甚至不需要对代码库进行完整的类型检查:它可以单独查看抽象语法树来建议更改和声音警报。您通常会选择ghc-modhdevtools并在连接中使用hlint来获取完整的Haskell IDE体验。

我们应该花时间在这里提一下FP Complete' intero项目,该项目运行ghci并且与hdevtools类似。它只适用于您的编辑器是Emacs并且您正在使用堆栈的情况。我无法找到有关它与ghc-modhdevtools的区别的详细文档。一个人认为它旨在为Emacs用户提供更好的体验,因为你经常会遇到hdevtools / ghc-mod由于编译器或编辑器包不匹配而顽固拒绝运行的情况。使用intero,您可以使用一小段Elisp启动并运行。

这是个烂摊子!