首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么F#中不存在"do...while“

为什么F#中不存在"do...while“
EN

Stack Overflow用户
提问于 2010-06-10 15:44:08
回答 8查看 9.3K关注 0票数 23

我找不到"do...while...“

我必须这样编写代码:

let bubbleSort a=
    let n = Array.length a
    let mutable swapped = true
    let mutable i = 0
    while swapped do
        swapped <- false
        for j = 0 to n-i-2 do
            if a.[j] > a.[j+1] then
                let t = a.[j]
                a.[j] <- a.[j+1]
                a.[j+1] <- t
                swapped <- true
        i <- i+1

如果没有"do...while“,代码就很糟糕。

遗憾的是,"break/continue“也不可用。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-06-10 17:37:56

F#非常适合于非函数式编程。事实上,对我来说,能够以命令式风格微调算法的各个部分是这门语言的主要优点之一。

例如,在处理项目euler问题时,我首先使用了一个使用不可变集合和折叠的干净的函数解决方案。它花了150秒才完成。现在,有了我的算法框架,我可以一次拆分数据结构和折叠一个操作,直到我设法将运行时间减少到5秒。我的最终解决方案是一个非常强制性的解决方案(甚至比同等的C#版本还要快一点)。

如你所见,我首先用函数式风格编写了一个解决方案,然后将小部分重写为命令式风格,从而解决了这个问题。不需要处理索引和其他循环条件,这使得代码对我来说更容易理解。

一旦你学会了如何像函数式程序员那样思考,你会发现你很少想要休息和继续。这就是我所经历的。但如果您确实需要它们,了解如何以函数式方式思考有助于提出变通方法,通常涉及过去循环的尾递归版本。

当您开始以一种惯用的F#方式思考时,您可能会看到越来越多的(尾部)递归代码取代了您过去使用循环构造所做的工作。见鬼,写了两年的F#到目前为止已经扭曲了我的思想,我更有可能选择递归和折叠而不是循环。

每当我认为我需要中断/继续时,我通常不会这样做,因为有一个更干净版本的算法隐藏起来,等待着退出。最大的挑战是学习如何找到更干净的版本。我担心大量的练习和好的例子是更好地从功能上思考的唯一途径,但我相信这是值得的。

编辑:具有讽刺意味的是,冒泡排序算法实际上是为具有可变内容的数组设计的。任何递归冒泡排序都可能比命令式排序更难理解。我想我刚刚毁了我在这里的帖子。

票数 34
EN

Stack Overflow用户

发布于 2015-04-27 02:49:34

let doWhile f c =
    f ()
    while c () do
        f ()
票数 16
EN

Stack Overflow用户

发布于 2010-06-10 15:50:56

breakcontinue将是一个非常有用的新特性;它们是保留字,也许我们会在该语言的未来版本中看到它们。缺少它们偶尔是一种小烦恼,但几乎不会使语言“不合适”。同时,一个可变的前哨可以工作,就像你在示例中所做的那样。

另请参阅

http://tomasp.net/blog/imperative-ii-break.aspx/

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3012533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档