如何在功能上迭代组合元素的集合?

时间:2015-07-01 01:18:27

标签: scala scalaz

我有一系列类型为A的值,我希望将其转换为类型B的序列。

A类型的某些元素可以转换为B,但是其他一些元素需要与前一个元素组合才能生成B.

我认为它是一个具有两种状态的小型状态机,第一种是在需要当前A时处理从A到B的转换,或者如果需要下一行则保存A并进入第二种状态;第二个状态将保存的A与新A组合以产生B然后返回到状态1.

我试图使用scalaz的class但是我担心我过度复杂了,当输入到达时我被迫返回假B EOF。

最优雅的解决方案是什么?

2 个答案:

答案 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)

您可以使用您的聚合函数替换添加。

希望这很有帮助。