如何學習 Haskell ?
本人有 Matlab、Maple、R 語言的基礎(都是入門級 …),想學 Haskell。
不知道從何學起?有沒有什麼資源推薦?網站、書籍等。
【視頻/課程】
UPDATE:不再推薦Erik Meijer的FP101x。直接看Hutton的書就夠了。
Introduction to Functional Programming
Erik Meijer的公開課,內容很淺,覆蓋基本Haskell語法,適合入門。用的教材是Programming in Haskell。他還在Channel 9上錄過一套Haskell教學視頻,不過那些視頻比較老了(口音一如既往有特色啊):C9 Lectures: Dr. Erik Meijer以下課程難度更高,適合有一定Haskell基礎者繼續學習。
https://videoag.fsmpi.rwth-aachen.de/?course=12ss-funkprog (亞琛工業大學的Haskell講課視頻,實現Haskell編譯器可以看)Oregon Programming Languages Summer School(OPLSS13中Simon Peyton Jones的系列講座「Adventures with types in Haskell」,著重介紹類型系統)CS240h: Functional Systems in Haskell (注重工程實踐,範圍與Real World Haskell相當)另外值得一看的還有
Explore our archive for haskell conference and community skillscast videos(skills matter上有許多Haskell相關講座的視頻,值得一看。註冊一個賬號就可以在線看,vimeo需要科學上網)Functional Programming (Channel 9上有一些跟Functional Programming相關的有趣講座)drKraken/haskell-must-watch · GitHub(一些Haskell相關視頻的清單)【教材】
Programming in Haskell(FP101x教材)
Learn You a Haskell for Great Good!(趣學指南)Thinking Functionally with HaskellHaskell: The Craft of Functional Programming (3rd Edition) 覆蓋基本Haskell語法,適合入門。尤其推薦第一本,篇幅短,內容精鍊,作為第一本Haskell書比趣學指南好。Real World Haskell
Parallel and Concurrent Programming in HaskellYesod Web Framework Book- Version 1.4Haskell Data Analysis CookbookHaskell Financial Data Modeling and Predictive Analytics
注重工程實踐。Real World Haskell的書覆蓋面廣,但是太舊,不少庫和語言的變化沒有包含;並行與並發編程、Yesod書這兩本尤其推薦。Pearls of Functional Algorithm Design
Purely Functional Data Structures純函數式的數據結構和演算法經典。Chris Okasaki的PFDS不管是搞Haskell還是搞OCaml/Scala都適合一讀,不過裡面的程序用的是Standard ML語言,加了一個奇怪的擴展支持lazy evaluation。Simon Peyton Jones: book(Implementing functional languages: a tutorial)
實現一門簡單的惰性純函數式語言的詳盡教材。Basic Category Theory for Computer Scientists
Conceptual Mathematics A First Introduction to Categories教範疇論的我能找到的最簡單的書。Erik Meijer在今年可能開設一門範疇論的MOOC,教材採用後一本。(更新:Meijer沒開課。。。。)【文檔】
The Haskell 98 Language Report
https://www.haskell.org/onlinereport/haskell2010/GHC DocumentationHaskell目前最新的語言標準是Haskell 2010。但ghc有許多重要的Haskell語言擴展,而ghc又幾乎是唯一能在生產環境用的開源Haskell編譯器。所以除了參考語言報告以外,掌握ghc的各種擴展和其他細節也十分重要。
【論文】
Wadler: Monads
著重推薦Monads for functional programming這篇。Simon Peyton Jones: papers
你連SPJ的論文都看不完,還好意思說自己喜歡Haskell?(逃ReadingList(GHC相關論文列表)
Research papers(Haskell與函數式編程論文列表)Journal of Functional Programming
Event: ICFP函數式編程的重量級期刊/會議。【博客】
Inside 206-105
Bartosz Milewski"s Programming Cafe on WordPress.comHome(Stephen Diehl博客)School of HaskellThe Comonad.Reader
ocharles.org.ukHaskell Programming【庫】
Total downloads
Hackage按照下載數排名的包列表。下載數靠前的包社區更常用、靠譜程度更高。【其他】
Programming Problems and Competitions :: HackerRank (刷題有助於入門)Welcome to FP Haskell Center(適合Haskell新人練手的雲IDE)UPDATE:這個雲IDE年底將會關閉。安利一發,本人《魔力Haskell》的作者,目前在滴滴內部組織了一個FP交流群,正在組內推廣haskell中,歡迎收看我們錄製的系列視頻(盡量一周一更):滴滴FP的愛頻道。
bitemyapp/learnhaskell · GitHub按著這個一步一步來就好了, 夠Modern, 夠Real World
1.找本書,把語法看一下2.把這裡的問題一個個過一遍:http://www.haskell.org/haskellwiki/H-99:_Ninety-Nine_Haskell_Problems3.做http://projecteuler.net 上的題目4.做些小項目
看完樓上的這幾本書後已經完全可以寫有一定複雜度的Haskell程序了。關鍵是多練習,多看一些網路上的開源Haskell項目。若有興趣的話,看ghc編譯器的源代碼能有很大的收穫。Learn You a Haskell for Great Good! 好書,適合初入門的。缺點是理論深度不夠。要全面的話和Real Word Haskell、Haskell:The Craft of Functional Programming (Third Edition)這兩本書一起看就更好了。
http://learnyouahaskell.com/chapters這個是最好的入門資料
---------------2年後的分割線---------------------
現在有國人寫得中文書出版了,我讀了部分,感覺不錯《Haskell函數式編程入門》--張淞編著haskell趣學指南
haskell想開始還是很容易的,但是想知道如何「學得差不多該收手了」就不是太容易了。在此我特別給出一個判斷標準——一旦你弄懂了monad lifting,我覺得你就可以開始學別的了
learn you a haskell &>&>haskell wikibook (intro+intermediate+monad)finish haskell 99 problems&>&>abstract algebra&>&>category theory&>&>intuitionistic type theory,agda
桌面使用xmonad,配著配著就也熟了。
大家說的都對,然而我補充一下,基本上入了門,能看懂代碼之後,可以直接去github上看hackage上各種主要輪子的代碼,
還有善用如下工具,
搜索引擎,hackage,hoogle,github,haskell wiki,stack overflow 一類的網站,
最最重要的
haskell language report 與 ghc user guide還是忘記該死的Haskell吧. 你要學php,學會寫完hello world就能跑去寫網頁了。學Haskell簡直就是沒上限的。等你看了learn yourself a Haskell for great good, real world Haskell, 你就發現你看得越多,不懂的就更多。然後你到處找文章,看wiki吧,最後明白該走的路始終是不能有捷徑繞過。於是老老實實去看lambda calculus, 學type theory,category therory,形式邏輯等等. 等了解明白後回來寫程序,碰到實際的問題,又發現這些問題不同學院不同人又有多種解法,然後你得跑去看論文,書是不會找得到的了。這時候你再回過頭想,咋不老老實實走php, python, ruby這些陽關大道,從事java c++這些有錢途的職業,何苦難為自己,這又是為什麼呢。:)
可以參考stackoverflow的回答,傳送門Getting started with Haskell
## 書
Haskell Programming from first principlesHaskell Programming書的話看上面一本就夠了,盡量把練習做完。每章後面也有推薦文獻,也盡量看完。如果覺得難的話,就先看 Graham Hutton 的 Programming in Haskell 第二版
Programming in Haskell## 課程
基礎Functional Programming in Haskell: Supercharge Your CodingFunctional Programming in Haskell進階
Fortgeschrittene Funktionale Programmierung In HaskelleKVV: SOSE2016 / 392186 Fortgeschrittene funktionale Programmierung in Haskell (V+ü)課件:GitHub - FFPiHaskell/Vorlesung2016: Folien und übungsaufgaben für unsere Vorlesung很棒,只不過這門課是通過德語講授的一份來自 fpcomplete 的教學大綱
A Haskell Study Syllabus :: FP Complete## 視頻
就推薦一下 Bartosz Milewski 的兩個系列視頻Category Theory:https://www.youtube.com/playlist?list=PLbgaMIhjbmEnaH_LTkxLI7FMa2HsnawM_Parallel and Concurrent Haskell:https://www.youtube.com/playlist?list=PLbgaMIhjbmEm_51-HWv9BQUXcmHYtl4sw## 練習
Train with Programming Challenges/Kata## 心態
不要著急,慢慢來,比較快。待續。請看How to learn Haskell, 這是我所見過最好的指導了, 從低級到高級, 先看什麼後看什麼. (附胡亂翻譯: Haskell/HowToLearnHaskell)
學這種函數式的,我覺得還是得編程。
上一個最近在刷的網站(加入了谷歌統計的,自備梯子)
http://www.codewars.com/r/jFjUnQ
想學就抽出時間來學,就當是玩。瞻前顧後,越老就越難學東西了。learn you haskell xxx, 現在都推薦那個了。real world haskell 對初學者的友好程度普遍不如前者好。敢緊拿出書來從頭開始看起吧。
就一個小建議:對於各種稍微抽象一點的概念像Functor, Applicative, Monad什麼的,一定要看實際的代碼實現,一步一步地看。雖然他們是範疇論的概念,但我覺得學Haskell的時候開始只要把它們當成一種模式就好了,不用想太複雜。很多教程有講怎麼理解這些概念和相關的函數,事實上看幾十篇教程還不如認真看一遍代碼。
用我自己的例子來說:Cont Monad里的callCC函數就卡了我很久。教程就直說callCC會在call輸入的continuation函數時馬上返回結果,就像命令式的return。當時我就納悶了:函數式哪兒來的馬上返回結果。直到看了callCC的實現才知道它把continuation套進了一個無視輸入的continuation,使得之後的計算被無視掉了,等同於直接返回結果。
覺得這個設計妙不可言的時候應該就是看懂了吧,大概。。
(順便貼上鏈接)Control.Monad.ContcallCC :: ((a -&> Cont r b) -&> Cont r a) -&> Cont r a
callCC f = Cont (k -&> runCont (f (a -&> Cont (\_ -&> k a))) k)
作為入坑剛小半個月的普通人,我覺得如果只是想入門的話並沒比別的語言難多少, 當然多少還是要難一點。
一開始最好兩本書一起看,一本趣學指南不用說,再加一本詳細點的,我買的是原版的the craft of functional programming。
難道一本不夠? 並不是,而是看一本看不懂得時候去看另一本的同一個知識點,大多數情況下你都能豁然開朗。
兩本交替著看起來其實很快, 刷完一遍基本概念,然後花一個小時感受下這篇有濕以來最有趣的教程,Functors, Applicatives, And Monads In Pictures。再回過頭去把functor, applicative 和monad的章節看一遍。
這個時候基本上常規的代碼已經能寫了,寫一些練習練習。工具嘛,我個人喜歡VS CODE + ghc-mod .
練習完畢就可以看real world Haskell了,上面例子非常多,應該就能幫你找到點用Haskell做工程的感覺(當然配合用stack那真真是極好的)
再之後? 沒有了,主要是這階段我也還沒走完呢, orz……學習路線 語法:learnxinyminutes-docs/zh-cn/haskell-cn.html.markdown at master · adambard/learnxinyminutes-docs · GitHub進階:看SICP用haskell寫習題吧。了解完haskell的函數式風格後寫寫小一點的(web server)應用吧,他的微線層可是很給力的哦github上有很多屌哥很喜歡玩http://haskell.cs.yale.edu/wp-content/uploads/2013/08/hask035-voellmy.pdf
推薦閱讀:
※什麼是GADT?它有什麼作用?
※OCaml or Haskell?
※Comonad有什麼實際用途?
※該如何理解Monad?
※學過Haskell是一種怎樣的體驗?