保留原始数据结构的FoldLeft可以使用递归函数来实现。以下是一个使用递归函数的示例代码:
sealed trait List[+A]
case object Nil extends List[Nothing]
case class Cons[+A](head: A, tail: List[A]) extends List[A]
def foldLeft[A, B](list: List[A], z: B)(f: (B, A) => B): B = list match {
case Nil => z
case Cons(head, tail) => foldLeft(tail, f(z, head))(f)
}
val list = Cons(1, Cons(2, Cons(3, Nil)))
val result = foldLeft(list, 0)((acc, x) => acc + x)
println(result) // Output: 6
在这个示例中,我们定义了一个简单的不可变链表数据结构List
,其中Nil
表示空列表,Cons
表示一个节点,包含一个头部元素和一个尾部列表。然后,我们实现了一个foldLeft
函数,它接受一个列表、一个初始值z
和一个二元函数f
,并使用递归将函数f
应用于列表中的每个元素。
在递归函数foldLeft
中,我们首先处理空列表Nil
的情况,直接返回初始值z
。对于非空列表Cons
,我们通过递归调用foldLeft
来处理尾部列表,并将结果作为新的初始值z
,然后将当前元素应用于函数f
。最终,递归函数会将结果累积到最后一个元素,并返回最终结果。
在示例中,我们使用foldLeft
对列表中的元素求和,并打印结果。输出结果为6,表示列表中的元素1、2、3的和为6。
这种方法可以保留原始数据结构,因为在递归调用中,我们只是对尾部列表进行操作,并保持了原始列表的结构。