我有一系列类型为A的值,我希望将其转换为类型B的序列。
A类型的某些元素可以转换为B,但是其他一些元素需要与前一个元素组合才能生成B.
我认为它是一个具有两种状态的小型状态机,第一种是在需要当前A时处理从A到B的转换,或者如果需要下一行则保存A并进入第二种状态;第二个状态将保存的A与新A组合以产生B然后返回到状态1.
我试图使用scalaz的class
但是我担心我过度复杂了,当输入到达时我被迫返回假B EOF。
最优雅的解决方案是什么?
答案 0 :(得分:2)
如何在序列上调用sliding()
方法?
您可能必须在序列的头部放置一个虚拟元素,以便正确评估/转换第一个元素(真实头部)。
如果map()
超过sliding(2)
的结果,那么地图会"请参阅"与其前身的每个元素。
val input: Seq[A] = ??? // real data here (no dummy values)
val output: Seq[B] = (dummy +: input).sliding(2).flatMap(a2b).toSeq
def a2b( arg: Seq[A] ): Seq[B] = {
// arg holds 2 elements
// return a Seq() of zero or more elements
}
答案 1 :(得分:0)
捅了一下:
将列表分为两个列表。第一个是你可以直接转换的,第二个是你需要合并的那个。
applicationId
将分区块中的逻辑替换为您需要的任何内容。
拥有这两个列表之后,你可以使用这样的东西做你需要的任何事情
scala> val l = List("String", 1, 4, "Hello")
l: List[Any] = List(String, 1, 4, Hello)
scala> val (string, int) = l partition { case s:String => true case _ => false}
string: List[Any] = List(String, Hello)
int: List[Any] = List(1, 4)
您可以使用您的聚合函数替换添加。
希望这很有帮助。