/* このアプローチは、tails と呼ばれる別の便利なメソッドに関して mapList を定義します。Daniel のように、List への暗黙の拡張に入れますが、それは純粋に好みの問題です */
implicit def richerList[A](list : List[A]) = new {
/* これは、リスト内の可能な各テールを返す tails と呼ばれるメソッドです。これは末尾再帰であるため、大きなリストで爆発することはありません。同名の Haskell 関数とは若干異なることに注意してください。Haskell バージョンでは、常に空のリストが結果に追加されます */
def tails : List[List[A]] = {
def loop(ls : List[A], accum : List[List[A]]) : List[List[A]] = ls match {
case _ :: tail => loop(tail, ls :: accum)
case _ => accum
}
loop(list, Nil).reverse
}
/* テールを使用するとこんな感じ
scala> "abc".toList.tails
res0: List[List[Char]] = List(List(a, b, c), List(b, c), List(c))
*/
/* これで、テールに基づいて mapList を定義できます */
def mapList[B](f : List[A] => B) = tails map f
}
/* これは、mapList を使用すると次のようになります
scala> "abc".toList mapList (_.reverse.mkString)
res1: List[String] = List(cba, cb, c)
*/