从高阶函数构建通用的可重用迭代模块

如何为迭代创建可重用的模块,使我能够:

  • 选择是否并行迭代
  • 让我指定需要执行任务的高级功能

这里有一些虚拟功能。它们本身构成了问题的第二部分: 我是否应该在这里有一个接口,使这些功能中的每一个至少实现参数inputDay:String? 还是具有带有配置类的通用函数更好,该配置类在其中实现了最小的接口?

def doStuff(inputDay: String,inputConfigSomething: String): Unit = println(inputDay + inputConfigSomething)
def doOtherStuff(inputDay: String): Unit = println(inputDay)

下面是迭代模块的一个示例,其中具体说明了所执行任务的具体实现:

val days = Seq("20190101","20190102","20190103")
val something = "foo"

def iteration(d: Seq[String],parallel: Boolean = false) = {
  if (parallel) {
    d.par.foreach(dd => {
      println(dd)
    })
  } else {
    d.foreach(dd => {
      println(dd)
    })
  }
}

iteration(days)

现在,第二,代替具体的实现,应该可以传递一个高阶函数来控制计算结果。 很遗憾,下面的代码尚未编译。

def iterationmodule(d: Seq[String],functionToApply: Function,parallel: Boolean = false) = {
  if (parallel) {
    d.par.foreach(dd => {
      functionToApply(dd)
    })
  } else {
    d.foreach(dd => {
      functionToApply(dd)
    })
  }
}

iterationmodule(days,doStuff)

尝试使用更通用的实现。这似乎太令人费解了。必须有一个更简单的方法。也, 它仍然无法编译,因为我无法在迭代模块中动态实例化C。而且,一次又一次键入一些C和F也很烦人。

trait MinimalIterationParameters {
  def inputDay: String
}

trait FunctionParameters

trait OperationService[C <: MinimalIterationParameters,F <: FunctionParameters] {
  def doOperation(config: C,functionParameter: F): Unit
}

case class Minimal(override val inputDay: String) extends MinimalIterationParameters

case class ExtendedThing(inputConfigSomething: String) extends FunctionParameters

object MyDummyoperationService extends OperationService[Minimal,ExtendedThing] {
  override def doOperation(config: Minimal,functionParameter: ExtendedThing): Unit = {
    println(config.inputDay + functionParameter.inputConfigSomething)
  }
}

def iterationmoduleGeneric[C <: MinimalIterationParameters,F <: FunctionParameters](d: Seq[String],functionToApply: OperationService[C,F],f: F,parallel: Boolean = false) = {
  if (parallel) {
    d.par.foreach(dd => {
      functionToApply.doOperation(C(dd),f)
    })
  } else {
    d.foreach(dd => {
      functionToApply.doOperation(C(dd),f)
    })
  }
}

val c = Minimal
iterationmoduleGeneric[Minimal,ExtendedThing](days,MyDummyoperationService,f = ExtendedThing("foo"))

编辑

看到第一个答案之后。确实,这要简单得多。因此已经向前迈出了一大步。 但是,我需要能够将迭代项作为参数传递给函数

    def iterationmodule[A](d: Seq[A],functionToApply: A => Any,parallel: Boolean = false): Unit =
  if (parallel) {
    d.par.foreach(functionToApply)
  }
  else {
    d.foreach(functionToApply)
  }

    def doStuff(inputDay: String,inputConfigSomething: String): Unit = println(inputDay + inputConfigSomething)
    iterationmodule[String](days,doStuff(d_each_reference,"foo"))

但是:

iterationmodule[String](days,"foo"))

显然不会编译,因为d_each_reference在那里没有定义。如何访问当前迭代的项目并将其传递给函数?

此外,尝试传递扁平化的迭代项和配置视图:

val configForIteration = days.map(d=> (d,something))
iterationmodule[(String,String)](configForIteration,doStuff)

无法编译。

zhaowene 回答:从高阶函数构建通用的可重用迭代模块

这会更接近您的需求吗?

def iterationModule[A](d: Seq[A],functionToApply: A=>Any,parallel: Boolean = false) :Unit =
  if (parallel) d.par.foreach(functionToApply)
  else          d.foreach(functionToApply)

def doStuff(a:Char,b :String) :Unit = println(a+b)
iterationModule(List('X','Y','Z'),doStuff(_,"foo"))
//Xfoo
//Yfoo
//Zfoo
本文链接:https://www.f2er.com/3009385.html

大家都在问