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

wiz*_*zup 10 haskell

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

经过一些研究,我找到了多个类似的工具,让我们按照自己的意愿行事

  • hlint
  • hdevtools
  • GHC-MOD

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

当我做一些测试时,我发现只有ghc-mod才能开箱即用(对于代码lint,不会尝试任何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
Run Code Online (Sandbox Code Playgroud)

我是否需要为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
Run Code Online (Sandbox Code Playgroud)

所有工具都是由stack install我安装/home/wizzup/.local/bin$PATH

hao*_*hao 18

ghc-mod安装一个名为ghc-mod你的二进制文件,$PATH它能够加载和查询你的软件包数据库和源代码(还有一个"交互式"版本ghc-modi,可以从标准输入中读取命令并坚持使用).它使用GHC和Cabal API来实现.进展停滞了一段时间,但现在又回到了繁华的状态.有Emacs/Vim/Sublime软件包知道如何与ghc-mod最终用户交谈并提供各种类似IDE的功能:类型检查,漏洞,程序/证明搜索,查找定义.

hdevtools是一个较新的项目,受到启发ghc-mod.它在体系结构上相似 - 使用每个编辑器包运行持久性后台服务器.它旨在完全取代ghc-mod.之间的差异ghc-modhdevtools似乎是哲学.hdevtools有更少的花式ghc-mod功能,但(根据我的经验)大大加快.从粗略看一眼代码库中看出来的东西:hdevtools似乎依赖于GHC API来实现类似GHCi的服务器,能够快速重新加载代码.也许这是获得良好表现的关键决定?我确信我过于简单化了.

hlint是非常不同的.这是一个古老的项目(由Haskell社区长老之一Neil Mitchell于2006年开始).它能够检测出典型的糟糕Haskell习惯(例如使用concat . map而不是concatMap),并且在某些情况下,可以轻微地重构它们.它依赖于haskell-src-exts将Haskell代码解析为AST.我相信hlint甚至不需要对代码库进行完整的类型检查:它可以单独查看抽象语法树来建议更改和声音警报.您通常会选择使用ghc-modhdevtools并用它们配合使用hlint,以获得完整的哈斯克尔的IDE体验.

我们应该花时间在这里提一下FP Complete的intero项目,它运行ghci并且类似于hdevtools.它只适用于您的编辑器是Emacs并且您正在使用堆栈的情况.我无法找到它的不同之处良好的文档ghc-modhdevtools; 一个假设它的目的是让Emacs用户更好的体验,因为你经常可以进入那里的情况hdevtools/ ghc-mod会固执地拒绝,因为编译器或编辑器程序不匹配的运行.有了intero你可以得到启动和elisp的一个小片段运行.

这是一个很大的老混乱!