gpt4 book ai didi

scala - 按特定顺序应用函数列表

转载 作者:行者123 更新时间:2023-12-02 09:08:28 26 4
gpt4 key购买 nike

我有一些代表选择的函数,每个选择都有不同的需求。考虑一下

f1 : Seq[A] => Seq[A]
f2 : Seq[A] => Seq[A]
f3 : Seq[A] => Seq[A]

其中 f1f2 更理想,而 f3 最不理想。我编写了这段 scala 代码来生成连续 2 个选择的结果,按从最理想到最不理想的顺序排列

def applyTwice[A](initial: Seq[A],
f1: Seq[A] => Seq[A],
f2: Seq[A] => Seq[A],
f3: Seq[A] => Seq[A]): Seq[A] = {

lazy val f1s = f1(initial).toStream
lazy val f2s = f2(initial).toStream
lazy val f3s = f3(initial).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> val funs = Seq(Fun[Int](2, _.map(_*2)), Fun[Int](3, _.map(_*3)))

funs: Seq[Fun[Int]] = List(Fun(2,), Fun(3,))

scala> applyN(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)))

编辑:我注意到我在这里使用了一个简化的成本函数,它只查看最大值,但您可以轻松收集成本列表并将您想要的任何决定应用于它们。

关于scala - 按特定顺序应用函数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19252486/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com