专访《Haskell函数式编程入门》作者张淞:浅谈Haskell的优点与启发
張淞,Haskell語言愛好者,著有《Haskell函數(shù)式編程入門》一書。目前就職于網(wǎng)易杭州研究院。在10月15日~17日的QCon上海2015上,他將分享《Haskell中的函數(shù)與類型系統(tǒng)》:
\\\Haskell中的主要概念其實都是圍繞類型展開的,類型系統(tǒng)主要是為我們管理程序的抽象與保證程序的正確性而引入的。為了更好的復(fù)用代碼,于是有了多態(tài)類型。某些類型有著共同的屬性,于是Haskell引入了類型類來管理它們。有一些類型是需要接受一個或者多個類型參數(shù)的,為了保證這一環(huán)節(jié)不會出錯,于是Haskell又引入了kind這一概念;同樣出于復(fù)用代碼的原因,Haskell又引入了kind多態(tài)??傊?#xff0c;抽象在一步一步加深,每加深一步就總結(jié)出更多公共的代碼,為我們自動完成更多事情,而帶來的問題就是會讓人更加難以理解。所以了解Haskell的類型系統(tǒng)對于我們理解代碼的復(fù)用、抽象非常有幫助。所以本次的演講主要包括:
\\- Haskell中的值\\t
- Haskell中的類型\\t
- Haskell中的類型類\\t
- Haskell中的類型的kind\\t
- 以上特性之應(yīng)用\
Haskell不僅僅是一門學(xué)術(shù)型的語言,而是一門非常適用于編寫應(yīng)用軟件的工程型語言,其實相當(dāng)多的思想是可以遷移到非函數(shù)式語言上的,但是對想要應(yīng)用這些思想的人來說,在思維的轉(zhuǎn)變上可能會有更長的路要走。主要的問題是,現(xiàn)在的人們習(xí)慣于他們已經(jīng)熟悉的東西,需要學(xué)習(xí)如何讓函數(shù)編程中的理論來指導(dǎo)實踐編程,最大程度上減少重復(fù),用更少的代碼完成更多的工作。
\\\在大會開始前,InfoQ采訪了張淞,談到了Haskell的優(yōu)點,對實際編程的啟發(fā)等話題。以下為采訪內(nèi)容:
\\InfoQ:您好,可以簡單做一下自我介紹嗎?
\\\張淞:我本名叫張淞 ,網(wǎng)上叫閱千人而惜知己,算是一個文藝屌絲吧。2012年從英國諾丁漢大學(xué)本科畢業(yè),2013年從牛津大學(xué)研究生畢業(yè),都是計算機科學(xué)專業(yè)。課程并沒有特別明確的方向,但是由于偏愛函數(shù)式編程與編程語言一些,所以選課大多與之相關(guān)。2014年年初,因為母校寧波諾丁漢大學(xué)空缺一個臨時的教職,于是牛津大學(xué)畢業(yè)后就先決定回國任教了,全職教授函數(shù)式編程這門課,所用的語言就是Haskell。目前供職于網(wǎng)易杭州研究院,現(xiàn)在的工作與數(shù)據(jù)分析相關(guān)。
\\\InfoQ:從學(xué)校到公司應(yīng)該有很多不同,可以分享一下這方面的感受么?
\\\張淞:在學(xué)校工作時我沒有研究壓力,所以是比較自由的。在教函數(shù)式編程之前,這門課的課本我已經(jīng)讀了5遍,并且已經(jīng)譯成中文。書很薄,是由我在英國諾丁漢大學(xué)的老師Graham Hutton教授著的。后來在牛津又旁聽了一遍這門課,當(dāng)時還給有問題的同學(xué)答疑,所以回到寧波諾丁漢大學(xué),教大二的學(xué)弟學(xué)妹們基本上是駕輕就熟的。教學(xué)任務(wù)也不是很大,一周大約有2小時的教學(xué)還有2小時的研討課,課件、課本、練習(xí)、試卷的參考很多,也不用太花時間準(zhǔn)備,所以比較輕松。有時間可以做自己喜歡的事,從SICP那本書上找一些題出給學(xué)生,讀一些Haskell相關(guān)的論文。而在公司則不太一樣,但是在網(wǎng)易杭州研究院,好處就是我們的工作不太會受到技術(shù)的限制,完全是由我們做什么、想怎么做決定的,不單調(diào)也不乏味,但只是感覺在公司的工作壓力比較大,因為自己的工作關(guān)乎到其他同事的進度,但即便如此還是比較開心,因為還在做著自己喜歡的事。
\\\InfoQ:Haskell吸引你的地方是?
\\\張淞:嚴(yán)格地說我的第一語言是Java,教我學(xué)Haskell的人正是招我回去教書的那位老師。很坦誠地講,Haskell在一開始并不吸引我,純函數(shù)、沒有變量讓當(dāng)時的我十分困惑并且有點抵觸。后來考試完,在學(xué)校的圖書館里解了24點,發(fā)現(xiàn)用Haskell比同學(xué)的Java解法長度短了接近10倍,后來又解決了八皇后問題,也是比Java少了近10倍的代碼;先不說效率,單純在表達能力上,Haskell是不能與其他如Java一類的語言同日而語的。偶然間又在學(xué)校圖書館里發(fā)現(xiàn)了Real World Haskell,完全顛覆了我對Haskell膚淺的認(rèn)識,才知道那薄薄的課本連Haskell的冰山一角都不算。
\\Haskell吸引我的地方主要是,強大的類型系統(tǒng)十分嚴(yán)謹(jǐn),部分地方嚴(yán)謹(jǐn)?shù)阶屓恕鞍l(fā)指”。這里可以舉一個例子,3.14是小數(shù),3.14e3等于3140,而3140可以當(dāng)成數(shù)字來處理,因為它可以是整數(shù),也可以是小數(shù),所以應(yīng)該歸屬于一個更為一般的類型類Num而不是Integral或者Fractional:
\\\\u0026gt; :t 3.14\\3.14 :: Fractional a =\u0026gt; a\\Prelude\u0026gt; :t 3.14e3\\3.14e3 :: Fractional a =\u0026gt; a\\Prelude\u0026gt; :set -XNumDecimals //開啟語言擴展\\Prelude\u0026gt; :t 3.14e3\\3.14e3 :: Num a =\u0026gt; a\\我沒有看到任何語言注意到了這種類型上的微妙變化,Clojure里直接就是Double了。Haskell里數(shù)字類型與數(shù)字類型類的關(guān)系是相當(dāng)嚴(yán)謹(jǐn)?shù)?#xff0c;嚴(yán)謹(jǐn)?shù)饺绻麤]有一定的理論背景根本不會清楚它背后這么設(shè)計的原因,Haskell里有很多不斷顛覆我之前思想的設(shè)計。有這樣細(xì)致入微的類型系統(tǒng)輔助可以保證很大一部分錯誤不會出現(xiàn),因為根本寫不出來不滿足類型的代碼,并且在我們的頭腦并不清醒的時候編譯器會始終幫助你保持理智。
\\另外,Haskell的基礎(chǔ)API設(shè)計非常有條理,這也是一些語言比如Scala的scalaz、JavaScript的Prelude.ls、Ix,基本都是基于Haskell Prelude的。Github上的CoffeeScript的coffee-mate與lazy.coffee,C++基于boost的prelude_CPP都或多或少受了Haskell的API設(shè)計的影響,你可以在Github上找到很多這樣模仿Haskell Prelude的項目。
\\\InfoQ:您感覺Haskell主要適合哪類項目?您在工作中使用多嗎?
\\\張淞:我并沒有什么特別大的項目經(jīng)驗,只是在學(xué)校里做過幾個玩具級別的編譯器與解釋器,另外還有一些其他小玩具,不能拿出見人的。但我能比較確定的是,用Haskell來編寫其他語言的編譯器與解釋器肯定再合適不過了,整套流程我也比較清楚??峙伦钪睦涌赡芫褪翘气P的Perl 6實現(xiàn)——Pugs了,還有由Ulf Norell在博士期間用Haskell實現(xiàn)的依賴類型的編程語言——Agda,另外還有Haskell廣泛使用的編譯器GHC,從92年到現(xiàn)在已經(jīng)20多年了,還是有非常好的可維護性并且在快速進化著,有很多教授與博士在這個平臺上做研究,每次更新都有很多新的特性加入,一件事物有這種進化的能力其實是很可怕的,無論它剛問世的時候有什么缺陷。其實就我的所見所聞,Haskell從前端到高性能服務(wù)器、再到嵌入式開發(fā)、自動交易系統(tǒng)都有比較成功能例子,所以Haskell比較適合做什么更多的是由人來決定的。
\\我在工作中直接使用Haskell的機會并不多,但是我會使用Haskell做一些原型設(shè)計與網(wǎng)絡(luò)接口測試。主要用的還是Haskell中的一些思想,比如代數(shù)類型、盡量消除變量的共享、盡可能多地使用純函數(shù)等等,此外如果要在動態(tài)類型與靜態(tài)類型語言中做選擇,我會主觀地傾向于后者。
\\\InfoQ:在實際的業(yè)務(wù)開發(fā)中,選擇編程語言會考慮哪些因素?
\\\張淞:我工程經(jīng)驗并不是很多,主要是考慮要解決的問題與團隊吧。最近解決的問題比較特殊,所以老大決定用了Clojure,因為需要用到一個很重要的庫,只有Clojure的實現(xiàn)比較好,另外就是團隊里的人多少都有一些函數(shù)式編程背景,所以最后決定使用了Clojure。
\\\InfoQ:在國外會有不少實際的項目會應(yīng)用到Haskell,比如近日InfoQ曾報道過《Facebook如何使用Haskell處理垃圾郵件》。就您所知,Haskell在國內(nèi)的應(yīng)用情況如何?
\\\張淞:我在Haskell的QQ群里得知有幾個小的創(chuàng)業(yè)團隊在用Haskell做前端開發(fā)還有游戲服務(wù)端開發(fā),但是沒有深入了解。在我看來,國內(nèi)是沒有什么使用函數(shù)式編程語言的氛圍的。最近網(wǎng)易在招聘,看了很多份簡歷,基本沒有見到有函數(shù)式編程語言背景的人,感覺主要的問題還是出在中國的高校,有函數(shù)式編程這門課的高校屈指可數(shù),他們教的主要還是C/C++、MFC這些東西,懂的要么是一些感興趣的學(xué)生,要么是一些好學(xué)的工程師,希望以后有空能以網(wǎng)易云課堂為平臺進一步推廣一下函數(shù)式編程。
\\\InfoQ:如果實際應(yīng)用比較少,您感覺Haskell能給我們實際編程帶來哪些啟發(fā)?
\\\張淞:我在前面大約提了幾點,一個是Haskell核心的API的設(shè)計邏輯十分清楚,所以被很多語言爭相模仿。無論你用什么語言,在設(shè)計API的時候照著Haskell中Functor、Applicative、Monad、Traversable、Foldable這些類型類來實現(xiàn)你的API,最后的邏輯條理都會非常清楚,基本不會看到眼花繚亂的設(shè)計模式滿天飛,我在看其他語言的API的時候也會找它們在Haskell中的對應(yīng)。在實踐中很多事情是從零開始的,我一般是先會定義出全部我所需要的類型,然后把計算與程序運行的流程搞清楚,明確需要從哪些類型計算出哪些類型并把函數(shù)簽名寫下來,接下來開始實現(xiàn)他們,最后把它們組合起來得到最終完整的程序。
\\\InfoQ:感謝接受我們的采訪,期待您在QCon上的分享。
總結(jié)
以上是生活随笔為你收集整理的专访《Haskell函数式编程入门》作者张淞:浅谈Haskell的优点与启发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 虚拟化--027 VMware vCen
- 下一篇: 你不知道的shell用法和脚本,简单强大