Scala:列表到列表的列表,习惯用法?

Scala:列表到列表的列表,习惯用法?,scala,scala-collections,Scala,Scala Collections,在Scala中,我编写了一个高阶函数,该函数迭代列表,并使用head和list对每个元素进行回调,即: def headAndSelf[A, B](li: List[A], f: (A, List[A]) => B): List[B] = { if (li == Nil) Nil else f(li.head, li) :: headAndSelf(li.tail, f) } 给定vala=列表(1,2,3) 然后我想到我可以从列表中得到标题,所以写起来更简单:

在Scala中,我编写了一个高阶函数,该函数迭代列表,并使用head和list对每个元素进行回调,即:

  def headAndSelf[A, B](li: List[A], f: (A, List[A]) => B): List[B] = { 
    if (li == Nil) Nil
    else f(li.head, li) :: headAndSelf(li.tail, f)
  }
给定
vala=列表(1,2,3)

然后我想到我可以从列表中得到标题,所以写起来更简单:

  def self[A, B](li: List[A], f: (List[A]) => B): List[B] = { 
    if (li == Nil) Nil
    else f(li) :: self(li.tail, f)
  }
(尽管这会让lambda变得不那么优雅)

然后我想,肯定有一种更简单、更惯用的方法可以将列表转换为列表列表。那是什么呢

附加问题:为什么Scala不能推断lambda的类型
a
是一个
List[Int]
,因此
x
也应该是一个
List[Int]
,不是吗

scala> self(a, x => x)
<console>:13: error: missing parameter type
       self(a, x => x)
               ^      
scala>self(a,x=>x)
:13:错误:缺少参数类型
self(a,x=>x)
^      

尾巴将完成大部分工作

tails
将有一个空列表作为其最后一个元素,您需要过滤掉它,这就是
collect
在下面所做的:

def headAndSelf[A,B](l: List[A])(f: (A, List[A]) => B) = 
  l.tails.collect{case list @ head :: _ => f(head, list)}.toList
这里演示的两个参数列表将允许正确的类型推断。在呼叫站点,您也需要两个列表,但这通常很方便:

headAndSelf(yourList){(h,l) => whatever}

tails
将完成大部分工作

tails
将有一个空列表作为其最后一个元素,您需要过滤掉它,这就是
collect
在下面所做的:

def headAndSelf[A,B](l: List[A])(f: (A, List[A]) => B) = 
  l.tails.collect{case list @ head :: _ => f(head, list)}.toList
这里演示的两个参数列表将允许正确的类型推断。在呼叫站点,您也需要两个列表,但这通常很方便:

headAndSelf(yourList){(h,l) => whatever}
if(li==Nil)不是idomatic。在这里使用模式匹配:
li匹配{case Nil=>Nil;case head::tail=>f(head,tail)}
if(li==Nil)不是idomatic的。在这里使用模式匹配:
li匹配{case Nil=>Nil;case head::tail=>f(head,tail)}