对于函数式编程中的vs map

Kni*_*t71 5 functional-programming scala

我正在学习使用scala进行函数式编程.一般来说,我注意到for循环在功能程序中没有太多使用,而是使用map.

问题

  1. 在性能,可读性等方面使用map for for循环有什么好处?

  2. 使用循环可以实现映射功能的目的是什么?

程序1:使用For循环

val num = 1 to 1000
val another = 1000 to 2000
for ( i <- num )
{
  for ( j <- another) 
  {
    println(i,j)
  }
}
Run Code Online (Sandbox Code Playgroud)

计划2:使用地图

val num = 1 to 1000
val another = 1000 to 2000
val mapper = num.map(x => another.map(y => (x,y))).flatten
mapper.map(x=>println(x))
Run Code Online (Sandbox Code Playgroud)

程序1和程序2都做同样的事情.

Bit*_*ler 4

答案其实很简单。

每当您在集合上使用循环时,它都有一个语义目的。您想要迭代集合的项目并打印它们。或者您想将元素的类型转换为另一种类型(映射)。或者您想要更改基数,例如计算集合元素的总和(折叠)。

当然,所有这些也可以使用 for 循环来完成,但对于代码的读者来说,与众所周知的命名操作(例如 map、iter、fold、筛选, ...

另一方面是,for 循环会导致使用可变状态的阴暗面。在没有可变状态的情况下,如何在 for 循环中对集合的元素求和?你不会。相反,您需要编写一个递归函数。因此,为了更好地衡量,最好尽早放弃在 for 循环中思考的习惯,享受勇敢的新函数式做事方式。

  • Scala 确实有一些尾递归支持 - 请参阅[这个问题](/sf/ask/217989971/优化) (2认同)