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。

很多其它精彩内容请关注:http://bbs.superwu.cn

关注超人学院微信二维码:

关注超人学院java免费学习交流群:

Scala---For语句段的更多相关文章

  1. Spark记录-Scala循环语句

    Scala while循环语句 当给定条件为真时,while循环重复一个语句或一组语句.它在执行循环体之前测试条件状态. 只要给定的条件为真,while循环语句重复执行目标语句. object Dem ...

  2. scala学习手记17 - 容器和类型推断

    关于scala的类型推断前面已经提到过多次.再来看一下下面这个例子: import java.util._ var list1: List[Int] = new ArrayList[Int] var ...

  3. 第一章 Scala基础篇

    目录 一.Scala基础语法 (一) 变量.类型.操作符 1.变量申明 2.字符串 3.数据类型 4.操作符 (二)循环判断 1.块表达式 2.条件表达式 3.循环表达式 (三)方法和函数 1.方法 ...

  4. 实验三——for语句及分支结构else-if

    1.本节课学习到的知识点: (1)for语句是循环语句,它可以实现c语句的重复执行 (2)for语句中的3个表达式的执行顺序和书写顺序不同 (3)遇到复合语句时要用大括号将几句话括起来,复合语句在语法 ...

  5. 实验三——for 语句及分支结构else-if

    1.本节课学习到的知识点:在本次课中,我学习了for语句的使用,认识了for语句的执行流,明确了三种表达式的意义.以及最常用的实现多分支的else-if语句. 2.实验过程中遇到的问题及解决方法:在本 ...

  6. 第三次作业——for 语句及分支结构else-if

    1.本次学习到的知识点: (1)else-if的一般形式:if(表达式1)语句1:else if(表达式2)语句2:........else if(表达式n-1)语句n-1:else语句n: (2)遇 ...

  7. MyBatis学习(二)、SQL语句映射文件(2)增删改查、参数、缓存

    二.SQL语句映射文件(2)增删改查.参数.缓存 2.2 select 一个select 元素非常简单.例如: <!-- 查询学生,根据id --> <select id=" ...

  8. 未找到数据,异常处理:exception when no_data_found then 异常处理语句;

    未找到数据. 在 select 字段 Into 变量 from 表 where 条件: 这种语句中很有可能会有select 不到数据的问题,导致报错"未找到数据" 要解决这种问题需 ...

  9. 作业3---for语句及分支结构else-if

    1.本次课学习到的知识点: (1)for语句的一般表达式,执行顺序: (2)指定次序的循环程序设计:数列的累加.累乘等: (3)else-if实现的分支结构可以判断语句的真假 2.实验过程中遇到的问题 ...

随机推荐

  1. 关于java 日文输出信息到 Jenkins Console Output 乱码问题

    java 将从读取到的外部调用程序的带有日文字符的输出信息 输出到Jenkins 上的Console Output 上乱码. 现象分析: Jenkins 上可以将日文正常显示出来,但是读取外部程序的输 ...

  2. [Linux]Centos git报错fatal: HTTP request failed

    在使用git pull.git push.git clone会报类似例如以下的错误: error: The requested URL returned error: 401 Unauthorized ...

  3. red hat Linux 使用CentOS yum源更新

    red hat linux是商业版软件,没有经过注册是无法使用红帽 yum源更新软件的,使用CentOS源更新操作如下: 1.删除red hat linux 原有的yum 源 rpm -aq | gr ...

  4. 浅谈Storm流式处理框架(转)

    Hadoop的高吞吐,海量数据处理的能力使得人们可以方便地处理海量数据.但是,Hadoop的缺点也和它的优点同样鲜明——延迟大,响应缓慢,运维复杂. 有需求也就有创造,在Hadoop基本奠定了大数据霸 ...

  5. LeetCode :: Binary Tree Zigzag Level Order Traversal [tree, BFS]

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  6. Android圆弧形ListView的实现

    本文带大家来实现ListView的圆弧形的分布排列,原理非常easy,就是依据ListView的每个Item的高度来对每个item进行偏移. 首先自己定义一个LinearLayout,这是ListVi ...

  7. SWT的对话框们

    对话框,都继承自org.eclipse.swt.widgets.Dialog,有Modal的和Modeless的区分,一般的对话框处理程序如下: <DialogType> dlg = ne ...

  8. Cocos2d-x中父节点scale对子节点的影响

    背景:在前几天,刚接触cocos2d-x,随便找了一张图,作为一个CCSprite,而且设置了scale属性,然后在这个sprite上创建了一个CCLabelTTF,并用sprite->addC ...

  9. WPF换肤之四:界面设计和代码设计分离

    原文:WPF换肤之四:界面设计和代码设计分离 说起WPF来,除了总所周知的图形处理核心的变化外,和Winform比起来,还有一个巨大的变革,那就是真正意义上做到了界面设计和代码设计的分离.这样可以让美 ...

  10. 基于VLC的视频播放器

    原文:基于VLC的视频播放器 最近在研究视频播放的功能,之前是使用VideoView.在网上看了一下,感觉不是很好,支持的格式比较少,现在网络视频的格式各种各样,感觉用VideoView播放起来局限性 ...