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