Scala - 组合函数n次

时间:2014-01-25 04:07:29

标签: scala scalaz

我有一个看起来像这样的函数:

def emulate: (Cpu => Cpu) => (Cpu => Cpu) = render => {
  handleOpcode   andThen
  handleTimers   andThen
  handleInput    andThen
  debug          andThen
  render
}

我想多次调用handleOpcode函数(比如说10次)。在Haskell中,我可能会写一个这样的函数:

ntimes n f = foldr (.) id (replicate n f)

但在Scala中,我不确定如何编写它。我试过了:

def nTimes(n: Int, f: => Any) = {
  val l = List.fill(n)(f)
  l.foldRight(identity[Function]){ (x, y) => y.andThen(x) }
}

但类型都错了。

有没有简单的方法来实现这一目标?理想情况下,无需创建自己的功能。 Scalaz中的某些东西也许?

2 个答案:

答案 0 :(得分:14)

您可以使用Function.chain方法:

scala> val add1 = (x:Int) => x+1
add1: Int => Int = <function1>

scala> val add5 = Function.chain(List.fill(5)(add1))
add5: Int => Int = <function1>

scala> add5(5)
res1: Int = 10

答案 1 :(得分:5)

我不确定Scalaz是否提供了更优雅的东西,但如果您按下这些类型,您的解决方案应该可以正常工作:

def nTimes[T](n: Int, f: T=>T) = {
  val l = List.fill(n)(f)
  l.foldRight(identity: T=>T){ (x, y) => y.andThen(x) }
}

// example
def inc(i: Int) = i+1

nTimes(5, inc)(0)
// => 5