2017-06-29 103 views
1

Scala中有無限循環的更多功能替代嗎?Scala替代無限循環

while(true) { 
    if (condition) { 
    // Do something 
    } else { 
    Thread.sleep(interval); 
    } 
} 

回答

4

一件事,你所能做的就是用高階功能,如Stream.continually和配對起來與for理解:

import scala.util.Random 
import scala.collection.immutable.Stream.continually 

def rollTheDice: Int = Random.nextInt(6) + 1 

for (n <- continually(rollTheDice)) { 
    println(s"the dice rolled $n") 
} 

這個例子本身並不是純粹的功能,因爲這種非引用透明的方法,但它是一個可能的構造,可以幫助你考慮功能組合,而不是使用副作用。

6

你可以做到這一點遞歸

@tailrec 
def loop(): Nothing = { 
if (condition) { 
    // Do something 
    } else { 
    Thread.sleep(interval); 
    } 
    loop() 
} 
+2

我認爲['Nothing'](http://scala-lang.org/api/current/scala/Nothing.html)是更合適的類型。 ['Unit'](http://scala-lang.org/api/current/scala/Unit.html)是不返回任何值的東西的類型。沒有東西是不會返回的東西的類型。 –

+0

@JörgWMittag爲什麼沒有「永不退貨」?我的理解是它只是一個底部類型 –

+1

底部類型*是一個沒有價值的類型。 (與具有單個唯一值的單位類型相反)。 –

3

我想無限尾遞歸:

@tailrec 
    def loop(): Nothing = { 
    if (condition) { 
     // Do something 
    } else { 
     Thread.sleep(interval); 
    } 
    loop() 
    } 
+1

我認爲['Nothing'](http://scala-lang.org/api/current/scala/Nothing.html)是更合適的類型。 ['Unit'](http://scala-lang.org/api/current/scala/Unit.html)是不返回任何值的東西的類型。沒有東西是不會返回的東西的類型。 –