![]() |
1
33
例如,在处理一个projecteuler问题时,我首先使用了一个干净的函数解决方案,使用了不可变的集合和折叠。花了150秒才完成。现在有了我的算法框架,我就可以把数据结构分开,一次折叠一个操作,直到我成功地把运行时间缩短到5秒。我的最终解决方案是非常必要的(甚至比同等的C版本还要快一些)。 如您所见,我首先用函数式风格编写解决方案,然后将小部分重写为命令式风格,从而解决了这个问题。不必显式地处理索引和其他循环条件,使代码更易于理解。 一旦你学会了如何像一个函数式程序员那样思考,你就会发现你很少需要休息和继续。这就是我的经历。但是,如果您确实需要它们,了解如何以函数方式进行思考有助于找到解决方法,通常涉及到以前是循环的尾部递归版本。 当你开始以惯用的F#方式思考更多的问题时,你可能会看到越来越多的(尾部)递归代码取代了你过去使用循环结构所做的事情。见鬼,写了2年的F#现在已经扭曲了我的思维,以至于我更倾向于选择递归和循环上的折叠。 每当我认为我需要中断/继续时,我通常不会这样做,因为隐藏了一个更干净的算法版本,等待退出。最大的挑战是学习如何找到更干净的版本。我担心大量的实践和好的例子是提高功能性思维的唯一途径,但我相信这是一种很好的努力。
|
![]() |
2
13
事实证明,在F#中编写一个足够好的do作为一个高阶函数非常容易:
|
![]() |
3
9
另请参见 |
![]() |
4
6
do/while不可用,因为F#是一种函数式语言,这种构造是命令式语言特有的。 由于同样的原因,中断/继续也不可用。
在C中#
单位:F#
|
![]() |
5
5
尽管有点冗长,但您可以使用递归函数来避免“do while”,如:
|
![]() |
6
4
我对F不太了解,但F是一种函数语言。通常,函数式编程语言中没有“for”或“while”循环。 函数语言在数学意义上定义函数(如f(x)=>…)。编写一个程序可以归结为定义和组合一组数学函数。这意味着编码循环的唯一方法是使用递归。 在数学中,没有办法说:
你要做的就是定义
这正是用函数式语言实现函数的方式。 至少,像Haskell这样的纯函数式语言是这样的。。。 |
![]() |
7
4
|
![]() |
8
0
你可以这样做
我最近才发现这条路。感觉有点不太好,但是我喜欢的是你可以构建一些更复杂的东西,这通常会导致C,C++的问题。
|
![]() |
Thomas · 使类型别名在F中不可互换# 3 年前 |
![]() |
sdgfsdh · 我该怎么说。使用异步转换函数进行收集? 6 年前 |
![]() |
Soldalma · 我可以实例化包含顶级副作用值的类吗? 6 年前 |
![]() |
matekus · F#-包含数字的字符串的自然排序 6 年前 |
![]() |
matekus · F#类型匹配-无法创建映射或匹配记录 6 年前 |
![]() |
Rob Lyndon · 未找到F#ProvidedTypes文件 6 年前 |
![]() |
red-swan · 如何将intro ML.Net演示翻译为F#? 6 年前 |
![]() |
jkone27 · F#-在编译时从字符串生成简单的空类型 6 年前 |