用于F#代码的类似HLint的工具?

时间:2013-11-01 04:33:50

标签: f# lint

HLint是Haskell代码的命令行静态分析工具,甚至可以建议适当的重构版本的代码。任何人都知道类似命令行工具的linting F#代码?

1 个答案:

答案 0 :(得分:12)

简答:

不,还没有这样的工具。

答案很长:

让我们讨论如何构建它。

我做了一些可能有用的背景研究。

参考

功能语言中有一些lint工具,可用作灵感来源。但是,他们倾向于走向不同的方向。

HLint是一种高级工具,其重构功能令人惊叹。由于(1)F#代码可能具有副作用,因此等式推理不健全(2)在进行无点转换时,价值限制可能会消除一些好的建议,因此重构建议在F#中更为棘手。如果我们接受误报,可能会变得容易一些。

在Scala的世界中,您有Wart RemoverScala Style。前者侧重于Scala中常见的函数式编程错误。后者的重点是人为错误和不一致(例如命名,惯例等)。我猜Wart Remover与F#更相关,因为它是一种功能优先的编程语言。但是,样式检查器工具在具有多个开发人员的大型代码库中非常有用。

F#最相关的lint工具可能是OCaml的样式检查器,Mascot。它有一个庞大且可扩展的规则集。其中许多规则适用于F#而且适应性很小。

资源(及其缺乏)

我们拥有什么:

  • F#编译器在GitHub上。相关组件 - F# compiler service具有NuGet包,因此引导很容易。 F#编译器源代码是一个很好的资源,因为F#编译器的警告非常好并且信息丰富。
  • 最近的作品使用F#编译器,例如语言绑定,重构,代码格式化等等,所以我们有经验积累。
  • 我们还有其他的lint工具可供学习。

我们没有:

  • 缺少有关F#推荐样式和实践的良好文档。 The design guideline很有用,但还不够完整。
  • 构建lint工具既费时又困难。即使是像Fantomas这样的简单和单一用途的工具;花费大量时间以正确的方式处理F#的AST。

总而言之,如果我们定义一个合适的范围,那么为F#创建一个简单但有用的工具是可以实现的。

更新

https://github.com/duckmatt/FSharpLint有一个积极开发的F#用品。我的分析似乎并不太远:)。