Avec scalaz 5:
doSomething.replicateM[List](n)
Avec scalaz 6:
n times doSomething
Et qui fonctionne comme vous le souhaitez avec la plupart des types (plus précisément, pour chaque monoïde):
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] = scalaz.effects.IO$$anon$2@36659c23
scala> res5.unsafePerformIO
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
On pourrait aussi dire doSomething replicateM_ 5
qui ne fonctionne que si votre doSomething
est une valeur monadique. Il a un meilleur type de sécurité, puisque vous pouvez faire ceci:
scala> putStrLn("Foo") replicateM_ 5
res6: scalaz.effects.IO[Unit] = scalaz.effects.IO$$anon$2@8fe8ee7
mais pas ce:
scala> { System.exit(0) } replicateM_ 5
<console>:15: error: value replicateM_ is not a member of Unit
Permettez-moi de vous voir arriver en Ruby.