我可以列出要执行的函数列表,其中函数采用不同的参数吗?

时间:2016-08-22 17:14:40

标签: scala

我有点困惑,需要一点手握。

如何运行要运行的函数列表,其中每个函数可能采用不同的参数集?

e.g。

def run1(a: Int)...
def run2(b:Int, c: Int) ...
def run3(x: Boolean) ...

然后将所有这些函数放在List中,然后我可以遍历并执行它们。

我必须以某种方式描述每个函数的基本接口,以便我可以调用例如run()on?

2 个答案:

答案 0 :(得分:4)

以下是可能解决问题的一种方法:

sealed trait Functions
case class Fun1(f: Int => Int)        extends Functions
case class Fun2(f: (Int, Int) => Int) extends Functions

// first  function adds 42 to input
// second function adds the two inputs
val xs: List[Functions] = List( Fun1( _ + 42 ), Fun2( _ + _ ) )

然后是一个如何折叠List[Functions]

的示例

此示例选择函数的任意输入,然后将它们一起添加。

scala> xs.foldLeft(0){ (acc, elem) => elem match {
     |    case Fun1(f) => f(42) + acc
     |    case Fun2(g) => g(10, 20) + acc
     | }
     | }
res1: Int = 114

答案 1 :(得分:0)

还有另一种选择,而不是模式匹配功能。您可以将决策责任转移到列表创建阶段。

我们的想法是为参数创建一个统一所有函数的公共接口。

case class Parameter(a: Int, b:Int, c:Int, d:Boolean ...)

val functions: List[Parameter => Unit] = List(
    p => run1(p.a),
    p => run2(p.b, p.c),
    p => run3(p.d),
    ...)

稍后当数据准备就绪时,它可以在Parameter对象中聚合并传输到函数

val param:Parameter = //aggregation of data

functions.foreach(f => f(param))