當我向一些新手推薦學習Haskell語言時,獲得的反應一般是:「爲何要學Haskell?」,「這是一種實用的語言嗎?」或者「這是一種我能夠真正用的語言嗎?」個人回答是明確的YES。git
Haskell並非我工做時的主要語言(我基本上是爲嵌入式系統寫C程序),但我仍然發現Haskell難以置信的有用。雖然個人工做歷來不用Haskell,我仍然認爲花時間去學習它是值得的。那麼,爲何要學習Haskell語言呢?github
事實證實,Haskell語言是一種很是強大的工具,能幫助你寫好C程序。我使用Haskell能作的事情常常是我平時認爲用常規方法根本不可行的事。編程
好比說,個人同事想在代碼庫裏找到全部用在if
條件語句裏的叫作foo
的變量。感謝神奇的language-c程序包以及Haskell語言的泛型,我能夠寫出一個Haskell函數,讓它接受一個預處理的C源代碼路徑做爲輸入值,輸出找到的位置(若是有的話),就像下面:數組
parseAndFindFoos :: FilePath -> IO (Either ParseError [Position]) parseAndFindFoos path = liftM (fmap findFooLocations) (parseCFilePre path) findFooLocations input = fmap posOf (listify isIfOfInterest input) isIfOfInterest (CIf cond _ _ _) = not (null (listify isFooIdent cond)) isFooIdent (Ident name _ _) = name == "foo" |
若是不包括類型標識,只有4行Haskell代碼!類型標識一般用來作推導,它一般會被看成說明放到doc裏。編程語言
這只是一個用在文章裏起說明做用的小例子。我使用Haskell語言作了遠比這複雜多的任務,例如從全局聲明或函數裏提取名稱和類型,或執行變換,往符合條件的表達式裏插入日誌函數或邊界檢查代碼。你找不出多少其它語言能像Haskell語言那樣讓你又快又簡潔的完成這種事情。函數
個人一個同事開發了一個神奇的工具,叫作plunge,它能讓你比較預處理的C代碼和源代碼,顯示出源代碼中的每行出如今通過預處理的代碼的什麼位置。工具
一樣,還有:學習
還有不少。atom
我真切的認爲,學習Heskell編程可以當即直接帶來的在編程方式上的附加效應就是,它會永遠的改變你編程思考的方式。沒錯,沒錯,我知道這聽起來像那種不疼不癢的、含糊的廢話,但我是很嚴肅的!學習Haskell語言已經對我編程方式、我思考的方式產生了大量的影響,比任何我在學校裏學的任何東西的影響都大,比任何我工做上的經驗的做用都大。spa
你是否嘗試過寫出一個複雜的函數,但裏面不含任何的可變變量?頭次嘗試這樣寫是十分痛苦的。但一旦你有了一些經驗,不只你會發現它會變得很容易,並且你會開始認識到,你的函數能夠分割成更小的片斷,比你最初想象的更小。那些複雜的函數將會變的徹底不是那麼複雜;它們能夠變成由三個簡單函數組成的函數!
這就像是,你只用右腳踢足球,但有一天,你的教練禁止你使用右腳。起初你怎麼踢都以爲彆扭。但最終你左腳變的和你的右腳同樣厲害,你最終成爲了一名更優秀的足球運動員。
Haskell語言是如此的不同凡響,以致於它會迫使你用徹底不一樣的方式思考你的程序。這就是它是一種很難學的語言的緣由之一,但一樣也是爲何學習它能得到這麼多益處的緣由。
在學習Haskell語言時,人們最多見的抱怨是它陡峭的學習曲線。人們的感受是對的,它的確具備一個陡峭的學習曲線。它給你的感受就像是徹底從新學習編程。它須要你費點功夫來忘掉你直覺上想用的那種編程模式。沒有可變變量!靜態類型!個人神呀,它能夠把一個函數當成參數,並返回這個函數!怎麼會有這種事!?
Haskell語言的難點並非那些複雜的東西,而是那些簡單的東西。好比Monads;Monads是出奇的簡單。它就是一種數據類型,它的實例由兩個很是簡單的函數實現。大部分的實現都只有1、兩行代碼!領會這些隱式的,有用的,強大的東西會花去你大量的努力。深奧的東西須要花時間去學。這很正常。這意味着你在學一些值得學的知識。
[英文原文: Why Haskell Is Worth Learning ]「只是由於三輪車好學,你就要一生騎三輪車嗎?」 – Douglas Englebart