Haskell 語言為什么值得你去學習

jopen 11年前發布 | 7K 次閱讀 Haskell

 Haskell 語言為什么值得你去學習

當我向一些新手推薦學習Haskell語言時,得到的反應通常是:“為什么要學Haskell?”,“這是一種實用的語言嗎?”或者“這是一種我可以真正的語言嗎?”我的回答是明確的YES

Haskell并不是我工作時的主要語言(我基本上是為嵌入式系統寫C程序),但我仍然發現Haskell難以置信的有用。雖然我的工作從來不用Haskell,我仍然認為花時間去學習它是值得的。那么,為什么要學習Haskell語言呢?

1. Haskell語言能很好的幫助運用C語言

事實證明,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"</pre>

如果不包括類型標識,只有4行Haskell代碼!類型標識通常用來做推導,它通常會被當作說明放到doc里。

這只是一個用在文章里起說明作用的小例子。我使用Haskell語言做了遠比這復雜多的任務,例如從全局聲明或函數里提取名稱和類型,或執行變換, 往符合條件的表達式里插入日志函數或邊界檢查代碼。你找不出多少其它語言能像Haskell語言那樣讓你又快又簡潔的完成這種事情。

我并非是唯一一個在C語言開發中使用Haskell語言的人

我的一個同事開發了一個神奇的工具,叫做plunge,它能讓你比較預處理的C代碼和源代碼,顯示出源代碼中的每行出現在經過預處理的代碼的什么位置。

同樣,還有:

  • atom – 一種Haskell語言開發的面向領域編程語言(DSL),能夠執行編譯調度,在限定的內存使用和準確的時間里編譯編譯代碼。
  • copilot – 一種用Haskell開發的流式(例如無限長列表)DSL,可以編譯進嵌入式C程序中。
  • ImProv – 用Haskell寫的一種命令式編程語言,用于高保障性應用。
  • </ul>

    還有很多。

    2. Haskell語言會改變你思維的方式

    我真切的認為,學習Heskell編程能夠立即直接帶來的在編程方式上的附加效應就是,它會永遠的改變你編程思考的方式。沒錯,沒錯,我知道這聽起 來像那種不疼不癢的、含糊的廢話,但我是很嚴肅的!學習Haskell語言已經對我編程方式、我思考的方式產生了大量的影響,比任何我在學校里學的任何東 西的影響都大,比任何我工作上的經驗的作用都大。

    你是否嘗試過寫出一個復雜的函數,但里面不含任何的可變變量?頭次嘗試這樣寫是十分痛苦的。但一旦你有了一些經驗,不僅你會發現它會變得很容易,而 且你會開始認識到,你的函數可以分割成更小的片段,比你最初想象的更小。那些復雜的函數將會變的完全不是那么復雜;它們可以變成由三個簡單函數組成的函 數!

    這就像是,你只用右腳踢足球,但有一天,你的教練禁止你使用右腳。起初你怎么踢都覺得別扭。但最終你左腳變的和你的右腳一樣厲害,你最終成為了一名更優秀的足球運動員。

    Haskell語言是如此的與眾不同,以至于它會迫使你用完全不同的方式思考你的程序。這就是它是一種很難學的語言的原因之一,但同樣也是為什么學習它能獲得這么多益處的原因。

    3.Haskell語言陡峭的學習曲線是件好事

    在學習Haskell語言時,人們最常見的抱怨是它陡峭的學習曲線。人們的感覺是對的,它的確具有一個陡峭的學習曲線。它給你的感覺就像是完全重新學習編程。它需要你費點功夫來忘掉你直覺上想用的那種編程模式。沒有可變變量!靜態類型!我的神呀,它可以把一個函數當成參數,并返回這個函數!怎么會有這種事!?

    Haskell語言的難點并不是那些復雜的東西,而是那些簡單的東西。比如Monads;Monads是出奇的簡單。它就是一種數據類型,它的實例由兩個非常簡單的函數實現。大部分的實現都只有一、兩行代碼!領會這些隱式的,有用的,強大的東西會花去你大量的努力。深奧的東西需要花時間去學。這很正常。這意味著你在學一些值得學的知識。

    “只是因為三輪車好學,你就要一輩子騎三輪車嗎?” – Douglas Englebart

    </blockquote>

    [英文原文: Why Haskell Is Worth Learning ]
           來自: 外刊IT評論 http://www.aqee.net/
     本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!