Подтвердить что ты не робот

Самый элегантный цикл повторения в Scala

Я ищу эквивалент:

for(_ <- 1 to n)
  some.code()

который был бы самым коротким и самым элегантным. Не существует ли в Scala ничего подобного?

rep(n)
  some.code()

Это одна из наиболее распространенных конструкций в конце концов.

PS

Я знаю, что легко реализовать rep, но я ищу что-то предопределенное.

4b9b3361

Ответ 1

1 to n foreach { _ => some.code() }

Ответ 2

Вы можете создать вспомогательный метод

def rep[A](n: Int)(f: => A) { if (n > 0) { f; rep(n-1)(f) } }

и используйте его:

rep(5) { println("hi") }

Основываясь на комментарии @Jörgs, я написал такой метод времени:

class Rep(n: Int) {
  def times[A](f: => A) { loop(f, n) }
  private def loop[A](f: => A, n: Int) { if (n > 0) { f; loop(f, n-1) } }
}
implicit def int2Rep(i: Int): Rep = new Rep(i)

// use it with
10.times { println("hi") }

Основываясь на комментариях @DanGordon, я написал такой метод времени:

implicit class Rep(n: Int) {
    def times[A](f: => A) { 1 to n foreach(_ => f) } 
}

// use it with
10.times { println("hi") }

Ответ 3

Я бы предложил что-то вроде этого:

List.fill(10)(println("hi"))

Существуют и другие способы, например:

(1 to 10).foreach(_ => println("hi"))

Спасибо Даниэлю С. за исправление.

Ответ 4

С помощью scalaz 6:

scala> import scalaz._; import Scalaz._; import effects._;
import scalaz._
import Scalaz._
import effects._

scala> 5 times "foo"
res0: java.lang.String = foofoofoofoofoo

scala> 5 times List(1,2)
res1: List[Int] = List(1, 2, 1, 2, 1, 2, 1, 2, 1, 2)

scala> 5 times 10
res2: Int = 50

scala> 5 times ((x: Int) => x + 1).endo
res3: scalaz.Endo[Int] = <function1>

scala> res3(10)
res4: Int = 15

scala> 5 times putStrLn("Hello, World!")
res5: scalaz.effects.IO[Unit] = [email protected]

scala> res5.unsafePerformIO
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!

[Сниппп скопирован из здесь.]