を開始するとScala 2.13
、以下と組み合わせることができるビルダーがList
提供されるようになりました。unfold
List::span
// val list = List('a, 'a, 'a, 'a, 'b, 'c, 'c, 'a, 'a, 'd, 'e, 'e, 'e, 'e)
List.unfold(list) {
case Nil => None
case rest => Some(rest.span(_ == rest.head))
}
// List[List[Symbol]] = List(List('a, 'a, 'a, 'a), List('b), List('c, 'c), List('a, 'a), List('d), List('e, 'e, 'e, 'e))
Scala 2.13
または代わりに、のOption#unless
ビルダーと組み合わせて:
List.unfold(list) {
rest => Option.unless(rest.isEmpty)(rest.span(_ == rest.head))
}
詳細:
- Unfold は内部状態を使用しますが、この場合は
list
to splitで初期化されますList('a, 'a, 'a, 'a, 'b, 'c, 'c, 'a, 'a, 'd, 'e, 'e, 'e, 'e)
- 各反復で
span
、同じシンボルを含む接頭辞を見つけるために、その内部状態を調べます。l.span(_ == l.head)
これは最初の反復中にl.span(_ == 'a)
あり、(List('a, 'a, 'a, 'a),List('b, 'c, 'c, 'a, 'a, 'd, 'e, 'e, 'e, 'e))
- 最初の部分が構築中のリストに追加する新しい要素 (こちら) であり、2 番目の部分が内部状態の新しい値(こちら) であるタプルの
unfold
反復ごとに予想されるように、そのスパンはまさにその要件に適合します。Option
List('a, 'a, 'a, 'a)
List('b, 'c, 'c, 'a, 'a, 'd, 'e, 'e, 'e, 'e)
- 内部リストが空になるまで同じステップを繰り返し
unfold
ますNone
。