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。
很多其它精彩内容请关注:http://bbs.superwu.cn
关注超人学院微信二维码:
关注超人学院java免费学习交流群:
Scala---For语句段的更多相关文章
- Spark记录-Scala循环语句
Scala while循环语句 当给定条件为真时,while循环重复一个语句或一组语句.它在执行循环体之前测试条件状态. 只要给定的条件为真,while循环语句重复执行目标语句. object Dem ...
- scala学习手记17 - 容器和类型推断
关于scala的类型推断前面已经提到过多次.再来看一下下面这个例子: import java.util._ var list1: List[Int] = new ArrayList[Int] var ...
- 第一章 Scala基础篇
目录 一.Scala基础语法 (一) 变量.类型.操作符 1.变量申明 2.字符串 3.数据类型 4.操作符 (二)循环判断 1.块表达式 2.条件表达式 3.循环表达式 (三)方法和函数 1.方法 ...
- 实验三——for语句及分支结构else-if
1.本节课学习到的知识点: (1)for语句是循环语句,它可以实现c语句的重复执行 (2)for语句中的3个表达式的执行顺序和书写顺序不同 (3)遇到复合语句时要用大括号将几句话括起来,复合语句在语法 ...
- 实验三——for 语句及分支结构else-if
1.本节课学习到的知识点:在本次课中,我学习了for语句的使用,认识了for语句的执行流,明确了三种表达式的意义.以及最常用的实现多分支的else-if语句. 2.实验过程中遇到的问题及解决方法:在本 ...
- 第三次作业——for 语句及分支结构else-if
1.本次学习到的知识点: (1)else-if的一般形式:if(表达式1)语句1:else if(表达式2)语句2:........else if(表达式n-1)语句n-1:else语句n: (2)遇 ...
- MyBatis学习(二)、SQL语句映射文件(2)增删改查、参数、缓存
二.SQL语句映射文件(2)增删改查.参数.缓存 2.2 select 一个select 元素非常简单.例如: <!-- 查询学生,根据id --> <select id=" ...
- 未找到数据,异常处理:exception when no_data_found then 异常处理语句;
未找到数据. 在 select 字段 Into 变量 from 表 where 条件: 这种语句中很有可能会有select 不到数据的问题,导致报错"未找到数据" 要解决这种问题需 ...
- 作业3---for语句及分支结构else-if
1.本次课学习到的知识点: (1)for语句的一般表达式,执行顺序: (2)指定次序的循环程序设计:数列的累加.累乘等: (3)else-if实现的分支结构可以判断语句的真假 2.实验过程中遇到的问题 ...
随机推荐
- JSON支持什么对象/类型?
原文:JSON支持什么对象/类型? 当一个面试官问你: JSON都支持什么对象/类型?你怎么回答? 也许他的本意是下面这个答案: JSON格式支持的数据类型有以下: 类型 描述 Number 在Jav ...
- 基于Cocos2dx开发卡牌游戏Demo_放开那三国 2.0
PS:下载地址在最以下 1.登录 2.副本选择 3.地图 4. 选择敌人 5. 战斗 6. 战斗结算 7. 地图拓展 8. 武将拓展 9. 下载地址: 点击打开链接
- TopCoder SRM 625 Incrementing Sequence 题解
本题就是给出一个数k和一个数组,包含N个元素,通过每次添加�数组中的一个数的操作,最后须要得到1 - N的一个序列,不用排序. 能够从暴力法入手,然后优化. 这里利用hash表进行优化,终于得到时间效 ...
- hdu1160(最长上升子序列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160 题意:给定一些小猫的属性:体重和速度.然后求某些猫顺序的排列,使得体重上升,速度下降,这样的排列 ...
- web框架之Spring-MVC环境搭建(转)
spring框架jar包 1.下载spring源包spring地址:http://www.springsource.org/download我下的是spring-framework-3.1.0.REL ...
- mysql联合索引的应用
有一个log表,结构是这样的: CREATE TABLE `weblog` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `ip` varc ...
- Android模拟器设置竖屏
使用Android模拟器測试自己开发的程序时,有时候会发现屏幕为横屏显示,查看效果非常不方便. 这里记录了一种禁止横屏的方法. 在文件 Mainfest.xml 中,在须要禁止横屏的 activit ...
- C++设计模式--观察员
概要 在软件构建过程中.我们须要为某些对象建立一种"通知依赖关系" --一个对象(目标对象)的状态发生改变,全部的依赖对象(观察者对象)都将得到通知.假设这种依赖关系过于紧密,将使 ...
- Get与Post的差别
Http定义了与server交互的不同方法,最主要的方法有4种,各自是GET,POST.PUT,DELETE. URL全称是资源描写叙述符.我们能够这样觉得:一个URL地址,它用于描写叙述一个网络上的 ...
- WPF界面设计技巧(4)—自定义列表项样式
原文:WPF界面设计技巧(4)-自定义列表项样式 有前面修改按钮样式的基础,我们可以尝试来定制一个即好看又好用的 ListBox ,今天先来讲“好看”部分. 打开 Microsoft Visual S ...