自學函數式語言(特指Haskell)需要什麼條件?
如題:提問者是一名自學編程的工科211學生,數學基礎尚可(離散數學沒學過)。想接觸函數式編程。需要做哪些預備功課才接觸Haskell呢?自學C語言過,能做出《C和指針》這類書絕大部分題目,幾乎沒有大型工程的經驗。水平很弱,求大家指導。
haskell是一個比較龐大的體系,要說條件的話,最好先看《計算機程序的構造與解釋》,這樣學習曲線相比較平緩
推薦5本haskell入門的書
@閱千人而惜知己 寫的《haskell函數式編程入門》 用這本書入門真的很好,寫得比較詳細,很多語言特性背後的內涵都有講解,可以幫你節省不少時間,內容也比較新。要說缺點的話,我個人感覺寫得有點簡略
《趣學指南》也是一本入門好書,但這本書寫得清楚明白是因為它本來就簡單,信息量不大。光看這本書能學到的東西很少
《real world haskell》很經典,很全面,但是成書時間有點早,很多示常式序已經運行不了,有基礎以後可以再補上
《beginning haskell》 主要是教你使用各種haskell的標準庫,內容很新,寫得也比較簡略
《haskell 並行與並發》 好書但主題比較窄,就算不用haskell,只是想了解並行和並發也可以看看,挺有意思的
上面五本書建議前兩本為一組,後三本為一組,按順序看下來。要說我有什麼經驗,就是學習一定要跟著高手從簡單到抽象,系統且有條理地學,這是一條沒那麼痛苦的道路《Haskell趣學指南》
能把Haskell搞定,你就會理解Erik Meijer大神所說的,把需求表達為類型的,正確的編程方法。
我在學函數式編程前只會些c語言,直接看的sicp,當時並不知道htdp這本書,後來才知道的,我覺得htdp入門更好,我推薦你學htdp,比sicp簡單,這本書有中文版,叫做程序設計方法
如何學習 Haskell ? - 邵成的回答
看我的資源帖。尤其推薦Erik Meijer的公開課,和Graham Hutton的教材Programming in Haskell。然後去hackerrank上做一些fp題練練手,寫一些fp常見的庫和應用,parser啊interpreter啊之類的東西。資源貼參考 @邵成,另外補充一下,haskellwiki上資源非常豐富(雖然有些文檔略淺舊)
練習向的:
1. 做題、演算法
基礎:Hacker Rank上FP部分99 Problems,經典系列。 實現隊列、棧、各種排序Project Euler Codeforces上的A-B題進階:
PFDS,堪稱函數式語言的「演算法導論」實現SuffixArray、SplayTree之類的。。
Codeforces上C以後的題(超時了不算,盡量換不超時的。。)2. 工程
練習:簡單如TODO List SomeTools/todo.hsReal World Haskell、Learn You Haskell for a great good等書上的例子以及用Haskell寫簡單的解釋器稍複雜:
用Yesod做小網站或者爬蟲(參考Developing Web Apps with Haskell and Yesod相關課程的大作業。繼續刷Parsec(寫編譯前端的神器),實現DSL或者中型語言。
光看看書、寫百把行的小東西是很難掌握的,和其他語言一個道理。本來看第一個回答,就不想回答了,後來突然發現他的評論,想想還是說一下。
我個人就是先看 SICP,再學 Haskell,我個人也是推薦這個方法的。為什麼呢?因為 Haskell 為了解決很多實踐問題,發明了太多實用的技術了。在你學習理解函數式編程的時候,這麼多實用的技術會嚴肅的影響你的進度,甚至讓你掉坑裡,最終放棄。
Haskell 當然不是不能拿來當入門語言,但是問題在於,自學的話,你找不到像 SICP 那麼好的教材。就比如說 Real World Haskell,你看看名字,Real World……如果有一本內容跟 SICP 差不多的書,用 Haskell 描述,那我一定推薦給樓主,畢竟 Haskell 漂亮太多(逃準備一天時間。
先用30分鐘看完下面的。代碼敲一遍。(需翻牆,如翻不過去,直接跳過。)
http://learnxinyminutes.com/docs/zh-cn/haskell-cn/再用8個小時看完下面的。
Learn Haskell Fast and Hard睡覺。
第二天起來還想學,就參考vczh推薦的書。
sicp比較磨性子。不用先啃。先隨便寫點什麼玩玩。
趣學指南那本很簡單。初中數學就能看懂。我覺得,學haskell這個行為,其實是三件事情,而不是一件事情。
1. 從演算法角度,學習一種編程思想:函數式編程
2. 從programming language角度,學習一種語言的數學特性:Haskell3. 從工程角度,了解語言的具體實現:Haskell的運行效率,各種庫第一點可以用sicp解決,不需要什麼基礎。第二點在你看完sicp之後就有足夠的基礎了,然後可以用 邵成 推薦的資源,第三點在你搞定第二點之後就有足夠的基礎了,然後靠自己練
沒有那麼多規規矩矩,想學就開始唄。
如果一定要列條件的話,我覺得最重要的就是不要害怕
不要害怕看英文,HASKELL的中文材料不是沒有,但是不夠,一定習慣於在必要的時候看英文的文章。
不要害怕提問,每個初學者都會遇到一個「稀奇古怪」的問題,單靠自己的力量確實很難解決。Haskell的社區對於新人挺友好,即使你在MAILLIST裡面問了初級的問題,也不會有人譏諷你,最多無人回復。從個人經驗來看,STACKOVERFLOW是很好的求助平台,相對來說知乎其實不是。
不要害怕數學概念,學HASKELL的過程中你會遇到很多的數學概念,一開始你可以只從代碼介面的角度去了解它,但是長期來看迴避這些數學概念肯定會影響你更進一步。
不要害怕挫折,一般來說學習HASKELL的過程中會有很多挫折,跳進這個坑之前一定做好足夠的心理準備。functional programming正在照著這個路子來
首先需要你的是堅持。需要什麼樣的基礎知識去學就好了,哪裡有那麼多的要求。
推薦閱讀:
※如果讓你來重新設計(或者改造)Haskell,你打算怎麼設計或者修改?
※Hindley-Milner 是什麼以及函數式編程中它的用途是什麼?
※柯里化在工程中有什麼好處?
※什麼是函數式語言?
※有哪些值得深入學習RxAndroid的開源項目?