8

HLint 是一个用于 Haskell 代码的命令行静态分析工具,它甚至可以建议代码的适当重构版本。有人知道用于检查 F# 代码的类似命令行工具吗?

4

1 回答 1

12

简短的回答:

不,还没有这样的工具。

长答案:

让我们讨论如何构建它。

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

参考

函数式语言中有一些 lint 工具,可以作为灵感来源。然而,他们往往会走向不同的方向。

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

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

与 F# 最相关的 lint 工具可能是 OCaml 的样式检查器Mascot。它有一个庞大且可扩展的规则集。这些规则中的许多规则都适用于 F#,只需稍作调整。

资源(以及缺乏)

我们有什么:

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

我们没有的:

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

总而言之,如果我们定义了一个正确的范围,那么为 F# 创建一个简单而有用的工具是触手可及的。

更新

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

于 2013-11-02T05:45:52.353 回答