如何學習 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 Haskell

Haskell: The Craft of Functional Programming (3rd Edition)

覆蓋基本Haskell語法,適合入門。尤其推薦第一本,篇幅短,內容精鍊,作為第一本Haskell書比趣學指南好。

Real World Haskell

Parallel and Concurrent Programming in Haskell

Yesod Web Framework Book- Version 1.4

Haskell Data Analysis Cookbook

Haskell 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 Documentation

Haskell目前最新的語言標準是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.com

Home(Stephen Diehl博客)

School of Haskell

The Comonad.Reader

ocharles.org.uk

Haskell 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_Problems

3.做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 principles

Haskell Programming

書的話看上面一本就夠了,盡量把練習做完。每章後面也有推薦文獻,也盡量看完。

如果覺得難的話,就先看 Graham Hutton 的 Programming in Haskell 第二版

Programming in Haskell

## 課程

基礎

Functional Programming in Haskell: Supercharge Your Coding

Functional Programming in Haskell

進階

Fortgeschrittene Funktionale Programmierung In Haskell

eKVV: 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.Cont

callCC :: ((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是一種怎樣的體驗?

TAG:Haskell | 編程學習 |