Scala: JVM上的函数编程

    说Scala是JVM上的函数编程一点也不为过,Scala把面向对象和函数型编程这两种主流编程范式结合了起来,对于熟悉各种编程范式的人而言Scala并没有带来太多革新的编程思想,scala主要的有点在于Java庞大的package优势,这样也就弥补了JVM平台上函数型编程的缺失,MS家.net上已经有了F#,JVM怎么能不跟上呢?

    对本人而言尽管Scala中functional应有尽有,但是做的不够好,体现在以下几点。

 

  • 类型系统。与主流的FP语言比较,如lisp、Erlang、Haskell,Scala的语法极为繁琐冗余,lisp虽然括号多了点,但是type系统极为简单。lisp是动态类型语言可能不具可比性,那么看haskell吧,haskell可是static typed language,写过haskell的程序后再用scala写一遍简直就要抓狂,为什么都是静态类型语言,haskell却能做的那么好呢?原因在于compiler,在本人看来scala的编译器比haskell有很大的距离,scala每个function的参数都要加个冒号和参数类型,haskell却不需要,不是haskell不知道,而是haskell的编译器搞定了类型推导,同时haskell的函数签名和函数定义分开的方式极大的提高了开发效率,这才是未来静态类型语言的发展方向。
  • list。scala的list真的不是一般繁琐,还要写List,cons竟然用两个冒号来表示,调用head和tail时竟要搞得像面向对象一样。谁会用scala的list去做些真正有用的事情呢?后来想一想,为什么Scala要用两个冒号来表示list操作呢?为什么不用一个冒号呢?原因是一个冒号容易让人误以为是类型声明呢!哎!很多语言都或多或少的有这种符号痛苦,很多语法设计不是多么的高深,只是不得已而为之。扯远了,回到list来,scala中的list有泛型支持,同样,语法怪异繁琐。
  • tuple。用tuple还要new个tuple对象,还是FP简单,直接用小括号就行了。
  • lambda。匿名函数在scala中的表示是=>,lambda在FP中极为常用,为什么不用更简单的->呢?
  • list comprehensions。 永远都是FP的 list comprehensions简单明了,[x+y|x<-[1..5], y<-[6..10]],scala使用了for yield语法,把真正重要的结果list表示却放在了后面,还是放在前面好些吧?yield?我还以为这是在写coroutine和genertor呢!
  • pattern match。这个让我更难受,都不想说了。
  • concurrency。scala用的是actor设计模式,和erlang一样,这个没什么多说,Erlang做的很好,如可靠性,分布式,还有强大的OTP各种behavie模式。

    总的感觉scala在函数型编程方面没有原生的函数型语言方便,如haksell,在concurrency方面又没有Erlang的可靠和性能,而且scala的语法实在是繁琐,如果要用函数型语言来解决个实际问题,还真要考虑考虑,用haksell多方便啊,实在不行用F#,.NET上优秀的资源也很多。

 

    Programming in Scala

 

你可能感兴趣的:(scala,erlang,haskell)