例えば:
val l = (1 to 100)
l.tails.collect { case (head +: tail) if tail.exists(_ % head == 0) => head } .toList
tail
各ステップで入力から 1 要素を引いた値を返すイテレータを生成します。
(1 to 10).tails.foreach(println)
与える
Vector(1, 2, 3, 4)
Vector(2, 3, 4)
Vector(3, 4)
Vector(4)
Vector()
これらの「テール」は、フィルターを適用するヘッド要素として表示でき、ヘッドを保持するかどうかを調べるために使用されるテール自体を表示できます。
このcollect
メソッドは部分関数を使用するため、ここで役立ちます。したがって、実際に値を保持するケースのみを指定する必要がありfilter
ますmap
。収集されます。
したがって、少なくとも 1 つの head 要素と任意のサイズの tail を持つ tail を照合し、その tail に head の倍数である要素が存在するかどうかを確認できます。ここでは一致の場合にガードを使用するため、一致は二重フィルターになります。1 つ目は末尾が空でないこと、2 つ目は複数でなければならないことです。倍数は、モジュラスがゼロであることを意味します。大文字と小文字が一致する場合は、検証済みの head 要素のみを返します。
最後に、特定の型注釈がないcollect
と、別のイテレータが返されるだけなので、結果を でリストに変換しtoList
ます。