我正在学习有关免费编写点的知识,并且在遇到这种情况之前一切都很好: 通用标签

这: 通用标签

我不知道如何克服序列生成器...这甚至可能吗?

我需要确保用法仍然可以正常使用。

仅供参考:我知道在这里使用无点编程似乎毫无意义。只是了解这对我来说是学习练习。

更新:这是我对第二个功能的第一次尝试。我不得不删除序列引用: 通用标签

有帮助吗?

解决方案

好吧,正如注释中已经提到的那样,以无点方式编写命令式代码根本不是一个好主意。它不仅不能使它更具可读性,而且可以使它更容易出错[em> ,因为推理执行起来比较困难。即使使用功能代码,我也经常发现非指向性样式更具可读性(并且不再更长)。

无论如何,正如您所问的那样,您可以采取一些步骤-请注意,这实际上是功能混淆的一种练习。没有你想做的事。

第一个函数的代码将被简化为这样的代码(由于序列表达式已优化,因此效率会降低): 通用标签

即使是无点样式,您仍然需要Seq.delay来确保您懒惰地执行序列。但是,您可以定义稍有不同的函数,从而使您可以编写更加无点的样式的代码。 通用标签

现在,函数的主体只是传递给delayArgs函数的某些函数。我们可以尝试以无点样式由其他函数组成该函数。然而,if很棘手,因此我们将其替换为具有三个功能(并将相同的输入传递给所有功能)的组合器: 通用标签

您不能以无点样式对待成员调用,因此您需要定义调用Read的函数。然后,您还可以使用返回常量函数的函数(为避免名称冲突,命名为konst): 通用标签

使用这两个参数,您可以将最后一个参数和第二个参数转换为无点样式: 通用标签

使用一些更疯狂的组合器(uncurry组合器存在于Haskell中; list2组合器也可以以无点样式编写,但我想您知道了): 通用标签

这不是很容易编译,因为toSeq5是作为其定义的一部分进行评估的,但是,如果插入一些延迟函数,它实际上可能会执行与原始操作相同的操作。

摘要-我不知道上面的代码是否正确以及如何评估(它可能会急切地评估读者,或包含其他错误)。它会进行类型检查,因此可能与工作相距不远。该代码完全不可读,难以调试,无法修改。

将其视为可以用F#编写的疯狂的无点代码的极端示例。实际上,我认为无点样式应仅用于琐碎的事情,例如使用>>编写函数。一旦需要定义诸如uncurrykonst之类的组合器,人们就很难阅读您的代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top