看看Scala标准库,我注意到很多函数(方法)都是以命令式的方式编写的:循环比tailrec更常用,等等。 例如:
@inline final override def takeWhile(p: A => Boolean): List[A] = {
val b = new ListBuffer[A]
var these = this
while (!these.isEmpty && p(these.head)) {
b += these.head
these = these.tail
}
b.toList
}
可以轻松重写(作为功能):
def takeWhile[A](p:A=>Boolean)(l:List[A]): List[A] ={
@tailrec
def takeWh(p:A=>Boolean,l:List[A],r:List[A]):List[A]={
if(l.isEmpty) r
else if(p(l.head)) takeWh(p,l.tail,l.head::r)
else r
}
takeWh(p,l,Nil).reverse
}
如果Scala应该是一种函数式语言,为什么Scala开发人员更喜欢命令式样式而不是函数?