Avr*_*oel 2 recursion f# functional-programming
在观看Tomas Petricek 的Pluralsight课程时(我认为他知道他在说什么),我看到的代码如下......
let echo =
MailboxProcessor<string>.Start(fun inbox ->
async {
while do true
let! msg = inbox.Receive()
printfn "Hello %s" msg
})
Run Code Online (Sandbox Code Playgroud)
忽略这是演示代理的事实,我对内部函数感兴趣,它使用while do true它来使它无限期地运行.
在寻找代理商的其他例子的同时,我看到许多其他人使用这样的代码......
let counter =
MailboxProcessor.Start(fun inbox ->
let rec loop n =
async { do printfn "n = %d, waiting..." n
let! msg = inbox.Receive()
return! loop(n+msg) }
loop 0)
Run Code Online (Sandbox Code Playgroud)
从Wikibooks复制的代码.
这里的内部函数是递归的,并且在main函数声明结束之前通过使用基值调用它来启动.
现在我意识到在第二种情况下递归是一种将私有值传递给内部函数而不必使用可变局部值的方便方法,但是还有其他理由在这里使用递归而不是while do true吗?使用递归编写第一个代码片段会有什么好处吗?
我发现非递归版本更容易阅读(当然是主观意见),这似乎是尽可能使用它的一个很好的理由.
Tom*_*cek 14
谈到MailboxProcessor具体而言,我认为选择取决于究竟你在做什么.通常,您始终可以使用while循环或递归.
递归使得更容易使用不可变状态,while如果你没有状态或者你使用可变状态,我会发现循环更好.使用可变状态通常非常有用,因为MailboxProcessor可以保护您免受并发访问,并且您可以将状态保持为本地状态,因此Dictionary(高效哈希表)之类的东西通常很有用.
一般来说:
while Dictionary或ResizeArray),我会选择while