2007-07-30
scala学习笔记(3) -- for comprehension
关键字: scala functional java comprehensionscala并不支持一般的for循环,取而代之的是for comprehesion。scala通过丰富
的for comprehesion特性支持各种循环结构。
要使一个类支持for comprehesion很简单,不需要继承任何trait,相应的实现
map, filter, flatMap, foreach四个方法中的一个或多个即可。下面针对每种
语法解释一下。
scala 伪代码
- // 语法形式
- for( val p <- e ) yield ee
- // 对应的函数调用 -- map
- e.map( p => ee )
- // 语法形式
- for( val p <- e ) ee
- // 对应的函数调用 -- foreach
- e.foreach { p => ee }
- // 语法形式
- for( val p <- e; val pp <- ee ) yield eee
- // 对应的函数调用 -- flatMap
- e.flatMap( p => for(pp <- ee ) yield eee )
- // 语法形式
- for( val p <- e; val pp <- ee ) eee
- // 对应的函数调用 -- foreach
- e.foreach( p => for( pp <- ee ) eee )
- // 语法形式
- for ( val p <- e ) if g ...
- // 对应的函数调用 -- filter
- p <- e.filter( ... => g )
也就是说,任何一个类,只要实现了map方法(参数为一个函数),就可以使用 for (val v < - new class) yield v 的语法。如果再实现了filter方法,就可以使用 for(val v < - obj if guard) yield v 的语法,如果实现了flatMap方法,就可以使用复合的 for(val v1< -o1; val v2< -o2) yield o1 op o2这样的语法,如果实现了foreach方法,可以实现 for(val v< -obj){f} 的语法。
scala对for comprehension的支持是通过在编译期检查类的方法增加的,不需要象java那样显示地从Iterable方法派生,而且4个函数之中可以根据需要来实现,要灵活地多。
举几个简单的例子对比一下
scala 代码
- class ForIterClass {
- def map(f: int => int): List[int] = List( 1, 2, 3 )
- def foreach(f: int => Unit) = println("hello foreach")
- }
- for( val p <- new ForIterClass) yield p
- // 等价于
- (new ForIterClass) map (p => p)
- for( val fc <- new ForIterClass ) println(fc)
- // 等价于
- (new ForIterClass) foreach (fc => println("hello foreach"))
- for { i <1 until n
- j <1 until i
- if isPrime(i+j)
- } yield (i, j)
- // 等价于
- (1 until n)
- .flatMap {
- case i => (1 until i)
- .filter { j => isPrime(i+j) }
- .map { case j => (i, j) } }
评论
wilson_xu
2007-08-01
test
fakechris
2007-07-31
呵呵,因为javaeye内置的java code quote显示类似 "<-" 这样的字符会乱七八糟,所以我选择代码的时候用的是xml模板,然后把”xml代码“改成”scala伪代码“....
Lich_Ray
2007-07-31
教教我“scala 伪代码”这个东西是怎么弄出来的吧
code 标签我不太会用。
fakechris
2007-07-30
javaeye的代码模块帖scala程序好像有问题,设置成xml勉强正常,如果设置为其他的语言 "<-" 的显示会乱掉
发表评论
- 浏览: 10120 次
- 性别:

- 来自: 北京

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
在scala里调用Hibernate ...
是在JVM上的一种函数式语言,和java可以互相调用,http://www.sc ...
-- by fakechris -
scala学习笔记(1)
用了 Java 的实现描述语法我知道;不过利用了虚类,确实有点新意啊。
-- by Lich_Ray -
scala学习笔记(1)
实际上String=>Unit 是一个scala的trait,相当于java的接 ...
-- by fakechris -
scala学习笔记(1)
var fn = new ( String=>Unit ) { def ap ...
-- by Lich_Ray -
python的小工具,把hibern ...
嗯,输入太工整了正则表达式也就能处理这么工整的代码了,格式比较乱的还是要上ast ...
-- by fakechris






评论排行榜