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())组合函数。