任意类型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接受A但iter(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`,它是一个返回其输入的函数。