2015-07-12 55 views
1

斯卡拉foldLeft实现:List实现foldLeft的

def foldLeft[B](z: B)(op: (B, A) => B): B = { 
    var result = z 
    this foreach (x => result = op(result, x)) 
    result 
} 

为什么斯卡拉develovers不使用类似的尾递归或别的东西,像这样的(这只是例子):

def foldLeft[T](start: T, myList: List[T])(f:(T, T) => T): T = { 
    def foldRec(accum: T, list: List[T]): T = { 
    list match { 
     case Nil => accum 
     case head :: tail => foldRec(f(accum, head), tail) 
    } 
    } 
    foldRec(start, myList) 
} 

是真的吗?为什么如果它不能/可以?

+3

我不确定所有这些“为什么用这种方式写这个Scala库?”即使所讨论的图书馆是标准图书馆,问题也是非常有用的。他们可能更适合Scala邮件列表,或者Scala/scala Gitter聊天室。 –

回答

0

根据this的回答,Scala确实支持尾递归优化,但看起来它从一开始就不存在,它可能在任何情况下都不起作用,因此具体的实现可能是剩余的。这就是说,斯卡拉是多范型的,我不认为它在功能编程方面追求纯净性,所以如果他们选择最实用或方便的方法,我不会感到惊讶。

2

“为什么不用这个简单的七行代码替代这个简单的三行代码片断?”

嗯。这就是为什么。

(如果你问有关性能,一会又需要这两种解决方案的基准和指示,不缝合版本是显著更快。)

0

除了当务之急的解决方法是简单的,它也一路更多一般。正如您可能已经注意到的,foldLeftTraversableOnce中实现,并且仅取决于foreach方法。因此,通过扩展Traversable并实施foreach,这可能是在任何集合上实现的最简单方法,您可以获得所有这些精彩的方法。

另一方面,声明性实现反映在列表的结构上,非常具体,因为它取决于Nil::