2007-07-26
scala学习笔记(1)
关键字: scala functional java由于有SML的底子,学习scala的过程也比较顺利。scala很多概念和sml是共通的,在这里记录一下学习中的一点心得。
-
scala是纯OO的语言,语言中所有的元素都是对象。数字是对象,函数也是对象。scala里所有对象的基类是Any,AnyVal是所有值类型对象的父类,包装了JVM中的值对象(int, boolean, float...),AnyRef是所有其他对象的父类,除了能够使用所有Java的类以外,Scala扩展了List、Symbol、Ordered几个比较有用的工具类。
-
scala 代码
- // 数字是对象
- scala> 1+2
- unnamed9: Int = 3
- // 1+ 是匿名函数,1是对象,+是方法,在scalal里是可以重载运算符的
- scala> var f: int=>int = (1+)
- f: (int) => int =
- scala> f(2)
- unnamed10: int = 3
-
scala支持匿名函数。匿名函数其实是从内置的scala模块中派生的。
-
scala 代码
- scala> ( (para:String) => println("hello " + para) ) ("world!")
- hello world!
- unnamed11: Unit = ()
- // 下面的写法和上面其实是等价的
- scala> var fn = new ( String=>Unit ) { def apply(para:String):Unit = println("he
- llo" + para) }
- fn: AnyRef with (String) => Unit =
- scala> fn(" world!")
- hello world!
- unnamed23: Unit = ()
- scala的匿名函数可以作为参数或者结果返回
-
scala 代码
- // 模仿sml的中缀复合函数,具体语法还需要斟酌
- // TODO: 利用impllit def把o函数插入到匿名函数对象中,实现与sml语法形式上的一样 (f o g) x = f(g(x))
- scala> trait o[A, B, C] {
- def apply(f: B=>C, g: A=>B): A=>C = { ( (x:A) => f(g(x))) }
- }
- scala> (new o[int,int,int]{}) ( (x=>x/3), (x=>x+1))(2)
- unnamed27: int = 1
- scala支持partial function, currying function以及call by name
-
scala 代码
- // currying & partial
- scala> def curry(a:int)(b:int) = a+b
- curry: (int)(int)Int
- scala> curry(1)(2)
- unnamed28: Int = 3
- scala> var f = curry(1)_
- f: (int) => Int =
- scala> f(2)
- unnamed29: Int = 3
- // call by name
- scala> def infloop:int = infloop
- infloop: int
- scala> def callbyname(x:int, y: => int) = 1
- callbyname: (int,=> int)Int
- scala> callbyname(12, infloop)
- unnamed31: Int = 1
- scala> def callbyvalue(x:int, y:int) = 1
- callbyname: (int,=> int)Int
- // 死循环....
- scala> callbyvalue(12, infloop)
Scala的特性太多了,以后慢慢记录吧。包括case class, bouned generic, Option class, Implicit type, ADT, type sharing constraint, xml, actor, list等等。
评论
Lich_Ray
2007-08-02
用了 Java 的实现描述语法我知道;不过利用了虚类,确实有点新意啊。
fakechris
2007-08-02
实际上String=>Unit 是一个scala的trait,相当于java的接口+abstract class。apply是接口中的abstract函数
{ def apply(para:String):Unit = println("hello" + para) } 是实现。
类似于Java中的 new List{....}
{ def apply(para:String):Unit = println("hello" + para) } 是实现。
类似于Java中的 new List{....}
Lich_Ray
2007-08-02
var fn = new ( String=>Unit ) { def apply(para:String):Unit = println("hello" + para) }
new ( String=>Unit ) 是一个对象,{ def apply(para:String):Unit = println("hello" + para) } 用来指定其调用行为,是吧?E 里面也有类似的东西,
def obj {
def run () {
// code here
}
}
我以前提到过的,妙处在于 def 的定义是不可更新的,满足了函数行为不可变的要求。
fakechris
2007-07-30
应该不是。scala的类型的基础是vObj calculus,应该比sml和haskell的类型系统还要弱一些,论文里提到vObj calculus还无法实现Applicative functors这样的功能
Lich_Ray
2007-07-30
显示类型声明。。。这让我想到一样东西:二阶 lambda 演算完全版~~~这是需要函数全显式声明类型的。但应该不是那个,否则 Scala 就有点无敌了——我们第一个知道的基于二阶 lambda 演算的语言。
cookoo
2007-07-28
scala有很多新潮的东西,只是显式类型声明看着总有点不FP的感觉。。。
Lich_Ray
2007-07-27
说的没错,就是“特性太多”,因为是个 general propose 语言。什么东西一“太”了就过了。别忘了 Scheme report 的开篇名言:Programming languages should be designed not by piling feature on top of feature, but by removing the weaknesses and restrictions that make additional features appear necessary. 我始终坚信这一点。把 Scala 的 pain-BNF 列出来看看,条数至少是 Scheme 的几十倍吧。
即便是面向对象语言,也有很简单却足够强大的,比方说只有 30 条 BNF 的 Io 语言。
即便是面向对象语言,也有很简单却足够强大的,比方说只有 30 条 BNF 的 Io 语言。
发表评论
- 浏览: 10114 次
- 性别:

- 来自: 北京

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
在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






评论排行榜