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

mca*_*dre 8 f# lint

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

pad*_*pad 12

简短回答:

不,还没有这样的工具.

答案很长:

我们来讨论如何构建它.

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

参考

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

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

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

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

资源(及其缺乏)

我们有什么:

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

我们没有的东西:

  • 缺少关于F#中推荐的样式和实践的良好文档.设计指南很有用,但还不够完整.
  • 建造棉绒工具既费时又困难.即使是像Fantomas这样的简单和单一用途的工具; 以正确的方式处理F#的AST需要花费大量的时间.

总而言之,如果我们定义一个合适的范围,那么为F#创建一个简单而有用的工具就在眼前.

更新

https://github.com/duckmatt/FSharpLint上有一个积极开发的F#linter .看来我的分析并不太远:).

  • 所有这一切都是可能的,但是我们需要为该项目做一些认真的贡献者,并且需要几个月的时间来构建它. (2认同)