Scala中的函数式编程 - 反向列表练习

时间:2016-08-29 13:12:40

标签: scala linked-list functional-programming

在通过Paul Chiusano和RúnarBjarnason编写的书中的练习和概念: Scala中的函数式编程时,我偶然发现编写自己的函数来反转列表。

作者为激励读者学习更多内容而提出的“建议”是看我们是否可以使用折叠来编写这样的函数。

我的“非折叠”版本如下:

def myrev(arr:List[Int]):List[Int] = if (arr.length > 0) { myrev(arr.tail) :+ arr.head } else arr

但是,有人可以给我一些关于如何至少启动逻辑以通过折叠来反转列表的指示吗?

我知道:

List(1,2,3,4).foldLeft(0)({case(x,y)=>x})

给出了初始的“种子”值,它高于0,并且:

List(1,2,3,4).foldLeft(0)({case(x,y)=>y})

给了我4这是列表的最后一个元素。

所以我需要提供一个函数给foldLeft一个“身份”函数,它可以给我一个元素在某个位置,并可能用它以某种方式反转列表,但我感到茫然。

我没有完全理解我在网上发现的一些Haskell代码,我想“挣扎”并试图通过一些指针自己到达那里,而不是简单地盲目复制一些解决方案,所以任何帮助都将非常感激

2 个答案:

答案 0 :(得分:3)

scala> List(1, 2, 3, 4).foldLeft(List.empty[Int])((result, currentElem) => currentElem :: result)
res2: List[Int] = List(4, 3, 2, 1)

答案 1 :(得分:0)

使用列表并使用foldLeft反转列表的函数的实现

def reverse (l: List[String]) = 
    l.foldLeft(List[String]())( (x: List[String], y: String) => y :: x )

创建列表并调用反向函数

val l = List("1", "2", "3")
reverse(l)

结果

res2: List(3, 2, 1): List[String]