我正在寻找代码lint,类型查询,自动类型插入和misc帮助器与vim一起使用(如自动完成)。
经过一些研究后,我发现了多个类似的工具,可以让我们按照自己的意愿行事。
主要问题:这些都是基本相同的工具吗?
当我做一些测试时,我发现只有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
答案 0 :(得分:18)
ghc-mod
将一个名为ghc-mod
的二进制文件安装到您的$PATH
,它可以加载和查询您的包数据库和源代码(还有一个" interactive"名为ghc-modi
的版本,从标准输入读取命令并粘贴在其中。它使用GHC和Cabal API来实现。进展停滞了一段时间,但现在又回到了繁华的状态。 Emacs / Vim / Sublime包知道如何与ghc-mod
交谈并为最终用户提供各种类似IDE的功能:类型检查,漏洞,程序/证明搜索,查找定义。
hdevtools
是一个较新的项目,受ghc-mod
的启发。它在体系结构上相似 - 使用每个编辑器包运行持久性后台服务器。它旨在完全取代ghc-mod
。 ghc-mod
和hdevtools
之间的差异似乎是哲学上的。 hdevtools
具有较少的花式ghc-mod功能,但(根据我的经验)显着更快。从粗略看一眼代码库中看出来的东西:hdevtools
似乎依赖于GHC API来实现类似GHCi的服务器,能够快速重新加载代码。也许这是获得良好表现的关键决定?我确信我过于简单化了。
hlint
非常不同。这是一个古老的项目(由Haskell社区长老之一Neil Mitchell于2006年开始)。它能够检测出典型的糟糕Haskell习惯(例如使用concat . map
代替concatMap
),并且在某些情况下,可以轻微地重构它们。它依赖于将{Haskell代码解析为AST的haskell-src-exts
。我相信hlint
甚至不需要对代码库进行完整的类型检查:它可以单独查看抽象语法树来建议更改和声音警报。您通常会选择ghc-mod
或hdevtools
并在连接中使用hlint
来获取完整的Haskell IDE体验。
我们应该花时间在这里提一下FP Complete' intero
项目,该项目运行ghci并且与hdevtools
类似。它只适用于您的编辑器是Emacs并且您正在使用堆栈的情况。我无法找到有关它与ghc-mod
或hdevtools
的区别的详细文档。一个人认为它旨在为Emacs用户提供更好的体验,因为你经常会遇到hdevtools
/ ghc-mod
由于编译器或编辑器包不匹配而顽固拒绝运行的情况。使用intero
,您可以使用一小段Elisp启动并运行。
这是个烂摊子!