【问题标题】:Can F# be refactored into a pointfree style?F# 可以重构为无点风格吗?
【发布时间】:2014-07-23 20:16:10
【问题描述】:

在研究与编程相关的主题时,我在 lambdabot 中发现了一个用于 Haskell 的 pointfree 重构工具,想知道是否可以将 F# 重构为无点样式?

我并不提倡使用无点样式,而是将其视为更好地理解函数的一种手段。

注意:pad 回答了这个问题的早期版本,但我重新措辞了这个问题,因为这个答案对学习和使用 F# 的其他人很有价值,我不希望这个被删除,因为投票数很接近。

注意:仅仅因为我改变了问题,不要认为答案意味着不能使用 F# 以无点风格进行编码。在很多情况下都可以这样做,但您必须遵守一些限制。

【问题讨论】:

  • "要求我们推荐或查找工具、库或最喜欢的非现场资源的问题对于 Stack Overflow 来说是题外话,因为它们往往会吸引固执己见的答案和垃圾邮件。相反,请描述问题和原因到目前为止已经解决了它。”

标签: f# pointfree


【解决方案1】:

简答

没有。

长答案

F# 中有一些东西使这样的工具变得不切实际。 (1) 由于 .NET 互操作,F# 代码经常有副作用,当副作用出现时,自动代码转换变得非常困难。 Haskell 并非如此。等式推理在 Haskell 中要容易得多,您可以在不改变其评估的情况下将左侧重写为右侧。 (2) F# 中的无点编程受value restriction 的限制。我不确定您是否可以积极地进行代码转换而不会遇到此问题。

我认为假设 F# 代码是纯代码并且在特定情况下不会出现值限制更实际,以便我们可以给用户一些提示。在评估建议实际上是正确的之后,用户可以离散地应用建议。它比您提到的更接近HLint 方法。 FSharpLint 在这个方向上添加了一些 linting 规则。

【讨论】:

  • 感谢您详细说明为什么 F# 不能存在这样的工具。这是一个很好的事实,可以隐藏起来以防将来需要。也许有一天我会做一个这样的工具,但要找出导致价值限制的地方,这样每个人都可以从中学习。
  • 您可以确定可以安全地应用无点重构的语言子集。但是,如果没有一些特殊的标记,例如 pure 关键字或 Pure 属性,则很难确保您留在安全区域内。
猜你喜欢
  • 2013-10-07
  • 1970-01-01
  • 2016-05-01
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
相关资源
最近更新 更多