scala - 在 Scala 中嵌套 for-comprehensions 是一种好的风格吗?

标签 scala for-comprehension

我刚刚发现自己写了一段代码,看起来像这样:

  def language(frequencies: Array[String], text: Array[String]) = {
    val allText = text.mkString.replace(" ", "")

    val emaps = for {
      fset <- frequencies
      devs = for {
        i <- 'a' to 'z'
        p = fset.indexOf(i) match {
          case -1 => 0d
          case x  => fset.substring(x + 1, x + 3).toDouble / 100 * allText.size
        }
        a = allText.count(i ==)
        dev = math.pow(p - a, 2)
      } yield dev
    } yield devs.sum

    emaps.min
  }

如您所见,值 emaps 是从字符串数组创建的 double 组。它工作正常。我以前从未见过像这样嵌套的 for-comprehensions。可以吗,还是我应该以某种方式重构?

最佳答案

使用 map 和 friend 通常比在 for 结构的循环部分编写长代码块更标准。由于 allText 不依赖于频率,因此您可以在开始时执行一次:

val lcounts = 'a' to 'z' map {i => i -> allText.count(i==)} toMap
val emaps = frequencies.map { fset =>
  val devs = 'a' to 'z' map { i =>
    val p = fset.indexOf(i) match {
      case -1 => 0d
      case x  => fset.substring(x+1, x+3).toDouble / 100 * allText.size
    }
    math.pow(p - lcounts(i), 2)
  }
  devs.sum
}

(此外,您确定要对负值进行平方吗,即 allText.count(i==) 为非零,但 fset.indexOf(i) 为 -1?这看起来很奇怪。)

关于scala - 在 Scala 中嵌套 for-comprehensions 是一种好的风格吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7154898/

相关文章:

scala - 如何解释用大括号括起来的函数值(菊石问题)

scala - 如何编写依赖 Druid 的集成测试?

scala - 为什么 Source.fromIterator 需要 Function0[Iterator[T]] 作为参数而不是 Iterator[T]?

Scala Option 的 collect 方法不喜欢我的 PartialFunction

scala - 如何在Scala中将此map/flatMap转换为for comprehension?

scala - 是否可以将 `case object`与类型参数一起使用?

scala - 用于从 for 理解中恢复的更好语法

scala:如何使用 for comprehension 重写此函数

scala - 用于理解 if 守卫