要素のシーケンスと述語が与えられた場合、各サブシーケンスで、すべての要素が満たされるか、シーケンスが長さを持つp
ように、シーケンスのシーケンスを生成したいと思います。さらに、結果を呼び出すと、元のシーケンスが返されます (したがって、要素の並べ替えはありません)。p
1
.flatten
たとえば、次のようになります。
val l = List(2, 4, -6, 3, 1, 8, 7, 10, 0)
val p = (i : Int) => i % 2 == 0
magic(l,p)
私は生産したいと思います:
List(List(2, 4, -6), List(3), List(1), List(8), List(7), List(10, 0))
については知って.span
いますが、そのメソッドは、満たさない値に最初に遭遇したときに停止しp
、ペアを返すだけです。
以下は実装候補です。それは私が望むことをしますが、まあ、私たちは泣きたくなる. 誰かがもう少し慣用的なものを考え出してほしいです。
def magic[T](elems : Seq[T], p : T=>Boolean) : Seq[Seq[T]] = {
val loop = elems.foldLeft[(Boolean,Seq[Seq[T]])]((false,Seq.empty)) { (pr,e) =>
val (lastOK,s) = pr
if(lastOK && p(e)) {
(true, s.init :+ (s.last :+ e))
} else {
(p(e), s :+ Seq(e))
}
}
loop._2
}
( の実際の型を保持することは特に気にしないことに注意してくださいSeq
。)