自學函數式語言(特指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.hs

Real 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角度,學習一種語言的數學特性:Haskell

3. 從工程角度,了解語言的具體實現:Haskell的運行效率,各種庫

第一點可以用sicp解決,不需要什麼基礎。

第二點在你看完sicp之後就有足夠的基礎了,然後可以用 邵成 推薦的資源,

第三點在你搞定第二點之後就有足夠的基礎了,然後靠自己練


沒有那麼多規規矩矩,想學就開始唄。

如果一定要列條件的話,我覺得最重要的就是不要害怕

不要害怕看英文,HASKELL的中文材料不是沒有,但是不夠,一定習慣於在必要的時候看英文的文章。

不要害怕提問,每個初學者都會遇到一個「稀奇古怪」的問題,單靠自己的力量確實很難解決。Haskell的社區對於新人挺友好,即使你在MAILLIST裡面問了初級的問題,也不會有人譏諷你,最多無人回復。從個人經驗來看,STACKOVERFLOW是很好的求助平台,相對來說知乎其實不是。

不要害怕數學概念,學HASKELL的過程中你會遇到很多的數學概念,一開始你可以只從代碼介面的角度去了解它,但是長期來看迴避這些數學概念肯定會影響你更進一步。

不要害怕挫折,一般來說學習HASKELL的過程中會有很多挫折,跳進這個坑之前一定做好足夠的心理準備。


functional programming

正在照著這個路子來


首先需要你的是堅持。需要什麼樣的基礎知識去學就好了,哪裡有那麼多的要求。


推薦閱讀:

如果讓你來重新設計(或者改造)Haskell,你打算怎麼設計或者修改?
Hindley-Milner 是什麼以及函數式編程中它的用途是什麼?
柯里化在工程中有什麼好處?
什麼是函數式語言?
有哪些值得深入學習RxAndroid的開源項目?

TAG:函數式編程 | Haskell |