scala - 任意类型A的函数组合

标签 scala

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))

关于scala - 任意类型A的函数组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68971891/

相关文章:

scala - Scala 中大括号和圆括号之间的正式区别是什么,何时应该使用它们?

ScalaCheck:生成任意类型的任意函数

scala - 如何将 Seq[Either[A,B]] 减少为 Either[A,Seq[B]]?

scala - 在 .sbt 文件中添加任务依赖

scala - 如何将包导入 Scala REPL?

Scala 可选最佳实践

java - Java 中有什么东西接近于 Scala 中的并行集合吗?

scala 控制台错误 : object apache is not a member of package org

scala - 是否可以在 Scala 中模拟/覆盖依赖项/导入?

scala - 在 spark-kafka 中使用 schema 将 ConsumerRecord 值转换为 Dataframe