С Скалаз 5 :
doSomething.replicateM[List](n)
С скалаз 6 :
n times doSomething
И это работает, как и следовало ожидать, для большинства типов (точнее, для каждого моноида ):
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!
Вы также можете сказать doSomething replicateM_ 5
, который работает, только если ваше doSomething
является идиоматическим значением (см. Applicative
). Он имеет лучшую безопасность типов, так как вы можете сделать это:
scala> putStrLn("Foo") replicateM_ 5
res6: scalaz.effects.IO[Unit] = scalaz.effects.IO$$anon$2@8fe8ee7
но не это:
scala> { System.exit(0) } replicateM_ 5
<console>:15: error: value replicateM_ is not a member of Unit
Позвольте мне увидеть, как вы справляетесь с этим в Ruby.