一个例子:
for(x <- c1; y <- c2; z <- c3) yield {...}
可以翻译成:
c1.flatMap(x => c2.flatMap(y => c3.map(z => {...})))
或:
for(x <- c1) for (y <- c2) for (z <- c3) yield {...}
根据第二次翻译,时间复杂度 O(c1 * c2 * c3),如果c1,c2,c3是非常大的数字怎么办?
我试图在互联网上搜索,我发现有很多代码比这个例子有更多的生成器。
问题:在其他语言中,我们希望避免使用嵌套for循环,但为什么scala设计了这种机制,因为它有一些特殊的技巧可以为嵌套循环提供非常好的性能?
如果我误解了某些内容,请告诉我,我想更好地了解scala中的理解。谢谢。
答案 0 :(得分:1)
为什么人们可能希望避免嵌套循环有两个原因。第一个是代码的可读性和质量(特别是在OOP中)。第二,如你所说,表现,但这不是一个硬性规则。这更像是一个指标,你可能在这个地方有较慢的代码,值得验证是否有可能更快地做同样的事情。显然,许多问题只需要Thu Sep 07 2017 01:59:59 GMT+0200 (CEST)
个步骤,如果使用嵌套循环或其他方式实现它并不重要。例如。最简单的情况是,如果您有两个大小为O(n^2)
的集合,并且您想打印所有对(笛卡尔积),则只需要n
个步骤即可。
请记住,Scala中的for-comprehension不仅仅是其他语言的O(n^2)
指令的替代品。它为您提供了一种使用Monads并编写更易读的代码的好方法。在for
中包含多个表达式并不一定意味着您在此处遇到性能问题。