【问题标题】:May a while loop be used with yield in scala可以在 Scala 中将 while 循环与 yield 一起使用
【发布时间】:2014-12-20 21:27:00
【问题描述】:

这是 scala 中 for/yield 的标准格式:注意它需要一个集合——其元素驱动迭代。

for (blah <- blahs) yield someThingDependentOnBlah

我有一种情况,循环中将发生不确定次数的迭代。内部循环逻辑确定将执行多少。

while (condition) { some logic that affects the triggering condition } yield blah

每次迭代都会生成一个序列的元素 - 就像对产量进行编程一样。推荐的方法是什么?

【问题讨论】:

  • 这有点含糊。 for ... yield 将一个不可变结构映射到另一个不可变结构,但while 通常用于操作一些可变状态,因此没有明显的yield 模拟。您能否提供更多有关您实际尝试做的事情的详细信息?

标签: scala yield


【解决方案1】:

类似于@rexkerr 建议的另一种方式:

 blahs.toIterator.map{ do something }.takeWhile(condition)

这感觉比Iterator.continually更自然一些

【讨论】:

  • 你能举例说明吗?
【解决方案2】:

你可以

Iterator.continually{ some logic; blah }.takeWhile(condition)

得到几乎相同的东西。您需要使用可变的东西(例如 var)来使逻辑影响条件。否则你可以

Iterator.iterate((blah, whatever)){ case (_,w) => (blah, some logic on w) }.
         takeWhile(condition on _._2).
         map(_._1)

【讨论】:

  • 谢谢 这涵盖了我正在寻找的精神
  • @RexKerr 一会儿怎么样?
  • @Sohaib - 迭代器用他们当前的方法集让这很尴尬。不过,您始终可以缓存元素。
【解决方案3】:

使用 for 推导式是错误的。您所描述的通常由unfold 完成,尽管该方法在 Scala 的标准库中不存在。不过,您可以在 Scalaz 中找到它。

【讨论】:

  • 好的。我只是做了一个普通的while循环,并在其中附加到一个ArrayBuffer
  • Scala 标准集合中存在巨大的功能漏洞......但切换到 scalaz 对我们其他人来说有点激进......
  • @matanster 这就像说使用 Apache Commons 有点激进。使用 all Apache Commons 可能是激进的,但是,比如说,只使用 commons-lang 就可以了。碰巧 Scalaz 附带了所有内容,但您可以将它用于,例如,unfold
  • 哦,好吧,你说得有道理。唉,学习曲线.. 但是 scalaz 的性能是否达到标准?
  • 那我可能会尝试一下,但这意味着任何阅读我的 Scala 代码的人都需要更长的学习曲线......希望你是对的 :)
猜你喜欢
  • 2014-01-09
  • 2014-04-11
  • 2013-07-06
  • 2010-11-11
  • 1970-01-01
  • 2017-10-09
  • 2020-08-25
  • 1970-01-01
  • 2015-01-21
相关资源
最近更新 更多