/ * Этот подход определяет mapList в терминах другого полезного метода, называемого tails. Как и Даниэль, я добавлю это в неявное расширение 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)
* /