常常讀個人博客的人應該知道,我最喜歡的編程語言是Haskell。我喜歡函數式編程,Haskell是一個能把函數式編程推向極致的語言。雖然如此,我仍然時刻關注着其它新興的和即將產生的編程語言,特別是函數式的編程語言,因此,當Scala誕生之初我就知道了這種語言。當時,我粗略的對它瞭解了一下,並非很喜歡;我感受它的那些語法對於個人口味來講過於甜膩,並且這種語言看起來異常的複雜。然而,一些我很尊敬的人都喜歡這種語言,因此我就再次的看了看。個人評論並非基於對這種語言的一個全面的瞭解之上,只是我經過幾周的閱讀和實驗獲得的收穫。無論怎樣,我已經有足夠的認識來聲明,Scala是個有趣的語言,值得去研究,特別是當你有Haskell編程背景的狀況下。我使用的是一本「階梯教程」(Programming In Scala by Odersky et al),這本書寫的很是好,我全力的推薦你們讀一下。web
我想學一種新的編程語言主要有兩個緣由。一個是我想找一種跟目前我使用的語言不一樣的語言,我想尋找一種另外的編程體驗。另外一個是我想找一種具備不少我從沒見過的有趣的新特徵的語言。Scala的出現徹底知足了個人苛求。.編程
本質上來說,Scala是一種運行在JVM之上的語言,它很快,使用它我能夠作圖形界面編程,web編程(用它的Lift框架),和移動設備編程(使用Android,我也知道讓Scala程序在Android上運行並非一個很容易的事)。Scala在這些領域出現的時間比Haskell早的多。我指望Haskell能最終遇上,可是我如今就已經喜歡上了寫這些類型的程序了。閉包
從理論的角度來看,Scala的訴求是靜態類型背景下的函數式編程和麪向對象編程的組合。這可不容易作到。在動態語言裏卻是容易些(例如Lisp使用CLOS),而靜態類型會使事情變得很是的複雜,尤爲是子類型化和繼承方面。Haskell可部分的支持面向對象編程(特別是使用類型類和現有類型),但我在Haskell裏沒有發現面向對象風格的繼承模型,儘管這是十分有用的。Scala有一個很是複雜的面向對象系統,還包括一些諸如顯式sub-和supertype標記,協方差(covariance)和反變(contravariance)標記,等等。這些都超越了我所見過的其它的面向對象的編程語言。實際上,Scala實現了把全部的函數性特徵都做爲對象,因此把它稱做一種對象-函數式語言並不許確,不如稱做爲超級面嚮對象語言更合適。框架
我認爲Scala的面向對象不是Haskell能比的;它是對於它的這種範式上的一個最佳案例。(我這裏忽略掉了那些類型依賴的函數式語言,諸如Agda/Coq/Epigram,我知道它們,但基本上它們已經再也不被當成一種用來作普通編程的語言了。)對於在靜態類型的環境中,是否對象已經超過函數變成一種更基礎的結構,我並不清楚。在動態類型語言中,你能夠由函數獲得對象(能夠假設函數就是閉包),或者你能夠由對象獲得函數,因此兩種觀念是能夠相互轉換的。不論這是否是一種使用靜態類型的案例,我想,用兩種語言從不一樣的方向來考慮這個問題是件頗有趣的事情。另外一方面,我曾學習過Smalltalk的面向對象特徵,我不得不說,我從沒見過第二個靜態類型的語言具備Smalltalk這樣優雅的簡單消息傳輸模型。再一方面,我更但願用Scala而不是Smalltalk來寫一個大型程序。(而且,若是你真的想直接進行消息傳輸時,Scala也有Actors類庫來支持你。)編程語言
另外一個Scala裏我喜歡的東西,也是Haskell共有的東西,就是他們都有學院理論根源。當你在設計一種具備深奧的類型系統的語言時,瞭解一些類型理論會很是的有幫助。Scala和Haskell的設計者都清楚這一點,這也就是在這些語言裏有不少高質量的特性的緣由。我但願有一天那些把希曼式實用主義看成理論基礎的人會閉嘴,由於事實證實經過學院派設計出來的語言纔是解決現實問題的上上之選。函數式編程
我會一直關注着Scala,我但願能對它瞭解的更多。但我仍然喜歡Haskell,我歷來不會打算放棄它。 函數