任意类型A的函数组合

def iter[A](f: A => A, n: Int): A => A = {
  if (n == 1) { 
    f
  } else {
    f(iter(f,n-1))
  }
}

我想制作一个iter使函数组合为 的函数f,例如:

iter(f,1) = f
iter(f,2) = f(f)

但是我找不到如何将类型递归地传递A给函数的方法f,我该如何解决这个问题?

回答

请注意,在您的代码中f(iter(f,n-1))f接受Aiter(f, n-1)类型为 的实例A => A

这是一个解决方案:

scala> def iter[A](f: A => A, n: Int): A => A =
|   if (n == 0) identity else f.compose(iter(f, n-1))
|
def iter[A](f: A => A, n: Int): A => A
scala> iter[Int](x => x + 1, 10)(0)
val res0: Int = 10

或者没有compose

scala> def iter[A](f: A => A, n: Int): A => A =
|   if (n == 0) identity else x => iter(f, n-1)(f(x))

甚至简单:

scala> def iter[A](f: A => A, n: Int): A => A = Function.chain(Seq.fill(n)(f))
  • `identity` 被定义为 `def identity[A](a: A) = a`,它是一个返回其输入的函数。

以上是任意类型A的函数组合的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>