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 代码
    1. // 数字是对象   
    2. scala> 1+2  
    3. unnamed9: Int = 3  
    4. // 1+ 是匿名函数,1是对象,+是方法,在scalal里是可以重载运算符的   
    5. scala> var f: int=>int = (1+)   
    6. f: (int) => int =    
    7. scala> f(2)   
    8. unnamed10: int = 3  
  • scala支持匿名函数。匿名函数其实是从内置的scala模块中派生的。
  • scala 代码
    1. scala> ( (para:String) => println("hello " + para) ) ("world!")   
    2. hello world!   
    3. unnamed11: Unit = ()   
    4.   
    5. // 下面的写法和上面其实是等价的   
    6. scala> var fn = new ( String=>Unit ) { def apply(para:String):Unit = println("he  
    7. llo" + para) }   
    8. fn: AnyRef with (String) => Unit =    
    9.   
    10. scala> fn(" world!")   
    11. hello world!   
    12. unnamed23: Unit = ()  
  •   scala的匿名函数可以作为参数或者结果返回
  • scala 代码
    1. // 模仿sml的中缀复合函数,具体语法还需要斟酌   
    2. // TODO: 利用impllit def把o函数插入到匿名函数对象中,实现与sml语法形式上的一样 (f o g) x = f(g(x))   
    3.   
    4. scala> trait o[A, B, C] {   
    5.   def apply(f: B=>C, g: A=>B): A=>C = { ( (x:A) => f(g(x))) }   
    6. }   
    7.   
    8. scala> (new o[int,int,int]{}) ( (x=>x/3), (x=>x+1))(2)   
    9. unnamed27: int = 1  
  •  scala支持partial function, currying function以及call by name
  • scala 代码
    1. // currying & partial     
    2.       
    3. scala> def curry(a:int)(b:int) = a+b       
    4. curry: (int)(int)Int       
    5.       
    6. scala> curry(1)(2)       
    7. unnamed28: Int = 3      
    8.       
    9. scala> var f = curry(1)_       
    10. f: (int) => Int =        
    11.       
    12. scala> f(2)       
    13. unnamed29: Int = 3      
    14.       
    15. // call by name   
    16.   
    17. scala> def infloop:int = infloop   
    18. infloop: int  
    19.   
    20. scala> def callbyname(x:int, y: => int) = 1  
    21. callbyname: (int,=> int)Int   
    22.   
    23. scala> callbyname(12, infloop)   
    24. unnamed31: Int = 1  
    25.   
    26. scala> def callbyvalue(x:int, y:int) = 1  
    27. callbyname: (int,=> int)Int   
    28.   
    29. // 死循环....   
    30. 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{....}
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 语言
发表评论

您还没有登录,请登录后发表评论

fakechris
搜索本博客
博客分类
存档
最新评论