/* 这种方法用另一种称为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))
*/
/* 现在我们可以根据tails定义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)
*/