您好,登录后才能下订单哦!
本篇内容介绍了“Scala For语句段怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
For语句段
语法:
Expr1 ::= „for‟ („(‟ Enumerators „)‟ | „{‟ Enumerators
„}‟) {nl} [„yield‟] Expr
Enumerators ::= Generator {semi Enumerator}
Enumerator ::= Generator
| Guard
| „val‟ Pattern1 „=‟ Expr
Generator ::= Pattern1 „<-‟ Expr [Guard]
Guard ::= „if‟ PostfixExpr
for语句段for (enums) yield e对于由枚举器enums产生的每个绑定求值表达式e。一个枚举器序列总是由一个产生器开始;然后可跟其他产生器,值定义,或守卫。一个产生器 p <- e从一个与模式p匹配的表达式e产生绑定。值定义val p = e将值名称p(或模式p中的数个名称)绑定到表达式e的求值结果上。守卫if e包含一个布尔表达式,限制了枚举出来的绑定。产生器和守卫的精确含义通过翻译为四个方法的调用来定义:map filter flatMap和foreach。这些方法可以针对不同的携带类型具有不同的实现。
翻译框架如下。在第一步里,每个产生器p <- e,对于e的类型被替换为如下形式,p不是不可反驳的(§8.1):
p <- e.filter { case p => true; case _ => false }
然后,以下规则将重复应用,直到所有的语句段都消耗完毕。
for语句段 for (p <- e) yield e‟被翻译为e.map { case p => e‟ }
for语句段 for (p <- e) e‟ 被翻译为e.foreach { case p => e‟ }
for语句段 for (p <- e; p‟ <- e‟ ...) yield e‟‟, 这里...是一个产生器或守卫序列(可能为空),该语句段翻译为 e.flatMap { case p => for(p‟ <- e‟ ...) yield e‟‟ }
for语句段 for (p <- e; p‟ <- e‟ ...) e‟‟
这里... 是一个产生器或守卫序列(可能为空),该语句段翻译为 e.foreach { case p => for (p‟ <- e‟ ...) e‟‟ }
后跟守卫if g的产生器p <- e翻译为单个产生器p <- e.filter((x1,...,xn) => g),这里x1,...,xn是p的自由变量。
后跟值定义val p‟ = e‟的产生器 p <- e翻译为以下值对产生器,这里的x和x‟是新名称: val (p, p‟) <- for (x@p <- e) yield { val x‟@p‟ = e‟; (x, x‟) }
示例6.19.1 以下代码产生1到n-1间所有和为素数的数值对
for { i <- 1 until n
j <- 1 until i
if isPrime(i+j)
} yield (i, j)
该for语句段翻译为:
(1 until n)
.flatMap {
case i => (1 until i)
.filter { j => isPrime(i+j) }
.map { case j => (i, j) }
示例6.19.2 for语句段可以用来简明地描述向量和矩阵算法。比如以下就是一个函数来计算给定矩阵的转置:
def transpose[A](xss: Array[Array[A]]) = {
for (i <- Array.range(0, xss(0).length)) yield
for (xs <- xss) yield xs(i)
}
以下是一个函数,用来计算两个向量的无向量积:
def scalprod(xs: Array[Double], ys: Array[Double]) = {
var acc = 0.0
for ((x, y) <- xs zip ys) acc = acc + x * y
acc
}
最后,这是一个求两个矩阵的积的函数。可以与示例 6.15.1中的常见版本做一个比较
def matmul(xss: Array[Array[Double]], yss: Array[Array[Double]] = {
val ysst = transpose(yss)
for (xs <- xss) yield
for (yst <- ysst) yield
scalprod(xs, yst)
}
以上代码使用了类scala.Array中已有定义的成员map, flatMap, filter和foreach。
“Scala For语句段怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。