f# - F#可以重构为pointfree风格吗?

标签 f# pointfree

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

我不是提倡使用pointfree风格,而是将其视为更好地理解函数的一种手段。

注:pad回答了这个问题的早期版本,但我改写了这个问题,因为这个答案对其他人学习和使用 F# 很有值(value),我不希望由于一些接近投票而将其删除。

注意:仅仅因为我更改了问题,不要认为答案意味着不能使用 F# 以点自由样式进行编码。它可以在许多情况下完成,但您必须遵守一些限制。

最佳答案

简答

不。

长答案

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

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

关于f# - F#可以重构为pointfree风格吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24890026/

相关文章:

f# - 如何取消装箱 F# 元组对象,其中元组具有任意数量的元素

f# - 如何将 out/ref extern 参数转换为 F#

haskell - 过滤功能免点

javascript - 具有扩展参数的 Pointfree 组合函数

haskell - 在 Haskell 中,当你只传递一个列表时,map 函数是什么意思?

javascript - 使用 Ramda 使函数 pointfree

xaml - FsXaml 类型提供程序相对于 XamlReader 的优势

recursion - F# 中的递归对象?

f# - 使用 FSPickler 将二进制反序列化为另一种类型

haskell - 无点形式与风格