Scala:列表到列表的列表,习惯用法?
在Scala中,我编写了一个高阶函数,该函数迭代列表,并使用head和list对每个元素进行回调,即: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) 然后我想到我可以从列表中得到标题,所以写起来更简单:
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)}