在Scala中反转列表时,类型B=>List[B]的表达式不符合预期的类型List[Int]

在Scala中反转列表时,类型B=>List[B]的表达式不符合预期的类型List[Int],scala,foldleft,Scala,Foldleft,使用foldLeft函数在Scala中反转列表的函数: def reverseWithFold(ls: List[Int]): List[Int] = ls.foldLeft(List[Int]())((c, _) => _:::c) 它得到了编译错误:类型List[B_]=>List[Int]的表达式不符合预期的类型List[Int]PS:我知道我的解决方案不正确 我能知道这是什么意思吗?在::c中,u代表c中的c,u,c是List[Int]类型,因此在我看来,::c应

使用foldLeft函数在Scala中反转列表的函数:

def reverseWithFold(ls: List[Int]): List[Int] =
        ls.foldLeft(List[Int]())((c, _) => _:::c)
它得到了编译错误:类型List[B_]=>List[Int]的表达式不符合预期的类型List[Int]PS:我知道我的解决方案不正确

我能知道这是什么意思吗?在::c中,u代表c中的c,u,c是List[Int]类型,因此在我看来,::c应该是两个List[Int]的串联。它应该符合预期的类型,对吗

ls-类型列表的列表[Int] foldLeft-从ls的Int元素创建新的内容。 列表[Int]-新的内容将是另一个列表[Int]。从一个空的开始。 c、 _u-当每个步骤接收到正在构建的列表时,我们将其称为c,并从ls中获取一个Int,但不要给它命名,即扔掉它。 _::c-尝试将两个列表连接在一起。一个是我们正在建立的c列表,另一个是…什么都没有。它不是一个列表或Int。它是一个未命名的参数,但我们没有这些。在收到的2个参数中,一个被命名为c,另一个被丢弃。 这里有一种解决方法:c,n=>Listn::c将两个列表连接在一起

这里有一个更好的方法来修复它:c,n=>n::c在这个列表的开头添加一个新元素


使用未命名的参数:ls.foldLeftList[Int]。:\u

您可以同时编写List1,2,3.reducex,y=>x+y或List1,2,3.reduce+。这里,x,y=>x+y和+u是函数,第一个更明显,第二个是函数,其中每个下划线都被一个参数替换

你在这里做的是c,=>。::c试图将两者结合起来。但是,实际上,您只是告诉scala编译器:

我有两个函数:c和另一个被丢弃。 此函数返回未指定类型的函数。示例:Int,Int=>Int=>Int=a:Int,=>2 你能做的就是

仅使用下划线重写:

ls.foldLeft(List.empty[Int])(_.::(_))
或重写而不丢弃:

ls.foldLeft(List.empty[Int])((acc, cur) => cur :: acc)

下划线不是有效的变量名,用于忽略变量。c、u和::c中的两个下划线是不相关的

c、 _u=>{…}完全忽略第二个参数,它消失了。 _:::c是lambda表达式x=>x:::c的快捷方式,该表达式需要一个x,该x是某个未知类型B_的列表[B_],该类型B_无法推断,因为不需要它,而且在代码中找不到它。 如果您想在第一个参数前面加上第二个参数,那么您必须编写如下内容

ls.foldLeft(List.empty[Int])((c, x) => x :: c)
甚至

ls.foldLeft(List.empty[Int])(_.::(_))

问题还不清楚。请您提供一个完整的可编译示例好吗?