Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 按特定顺序应用函数列表_Scala_Functional Programming_Combinatorics - Fatal编程技术网

Scala 按特定顺序应用函数列表

Scala 按特定顺序应用函数列表,scala,functional-programming,combinatorics,Scala,Functional Programming,Combinatorics,我有一些表示选择的函数,每个选择都有不同的可取性。考虑 f1:Seq[A]=>Seq[A] f2:序号[A]=>序号[A] f3:序号[A]=>序号[A] 其中f1比f2更可取,而f3最不可取。我编写这段scala代码是为了生成两个连续选择的结果,按从最理想到最不理想的顺序排列 def applyTwice[A](首字母:Seq[A], f1:Seq[A]=>Seq[A], f2:序号[A]=>序号[A], f3:Seq[A]=>Seq[A]:Seq[A]={ 惰性值f1s=f1(初始值).t

我有一些表示选择的函数,每个选择都有不同的可取性。考虑

f1:Seq[A]=>Seq[A]
f2:序号[A]=>序号[A]
f3:序号[A]=>序号[A]
其中
f1
f2
更可取,而
f3
最不可取。我编写这段scala代码是为了生成两个连续选择的结果,按从最理想到最不理想的顺序排列

def applyTwice[A](首字母:Seq[A],
f1:Seq[A]=>Seq[A],
f2:序号[A]=>序号[A],
f3:Seq[A]=>Seq[A]:Seq[A]={
惰性值f1s=f1(初始值).toStream
延迟值f2s=f2(初始).toStream
延迟值f3s=f3(初始).toStream
f1(f1s)++
f2(f1s)+f1(f2s)++
f2(f2s)++
f1(f3s)++f3(f1s)++
f2(f3s)++f3(f2s)++
f3(f3s)
}
通常,一系列函数应用程序按系列中最差的函数进行排序。如果最差的是平局,比较第二差,依此类推。例如,
f4(f1(a))
会比
f3(f3(a))
差,因为
f4
f3
差。请注意,它是
f3(f2(a))
f2(f3(a))
之间的纽带


我可能可以将其推广到数量可变的函数和(难度更大的)数量可变的应用程序,但这似乎是一个经典问题,我只是不知道它的名称。这是否已经内置到某种语言/库中?有更好的方法吗?

我不认为这是一件众所周知的事情,但概括起来很容易:

import scala.math.max
case class Fun[A](cost : Int, fun : Seq[A] => Seq[A])

def applyN[A](funs : Seq[Fun[A]], n : Int, initial : Seq[A]) = 
  (Seq((0, initial)) /: (1 to n)) { 
    case (acc, _) => for {
      f <- funs
      (cost, old) <- acc
    } yield (max(cost, f.cost), f.fun(old))
}
导入scala.math.max
案例类趣味[A](成本:整数,趣味:序号[A]=>序号[A])
def applyN[A](funs:Seq[Fun[A]],n:Int,首字母:Seq[A])=
(Seq((0,首字母))/:(1到n)){
案例(acc,))=>适用于{
f阿普林(funs,2,Seq(1,2,3,4))

res0:Seq[(Int,Seq[Int])]=List((2,List(4,8,12,16)),(3,List(6,12,18,24)),(3,List(6,12,18,24)),(3,List(9,18,27,36)))


编辑:我注意到我在这里使用了一个简化的成本函数,它只看最大值,但你可以很容易地收集成本列表,并对其应用你想要的任何决策。

f1..fn做什么?@Shrey,你是说关于问题域吗?很难解释,我认为这不相关。问题的核心是em是关于将项目放置到位置的,但是有一些业务规则可以使某些位置比其他位置更好。这很好,但我在这里没有提到懒惰很重要-如果
f2(f2(a))中存在解决方案,我想避免调用
f3
。我想我可以修改你的代码来做到这一点,在这种情况下,
成本就变得不必要了。啊,好吧,我想我明白你的意思了。在这种情况下,一种方法是在将函数组合应用于初始值之前以类似的方式构建它们,在这种情况下,你可以在视图上执行类似于“查找”的操作来获得first匹配解决方案。您可以使用
f.compose(g)
为f(g())或
f.and(g)
为g(f())组合函数。