2011-11-18 18 views
19

儘管有Lisp和ML的一些經驗,但我在學習閱讀和(習慣性)編寫Haskell時遇到了很多麻煩,因爲本地風格似乎是學習慣用Haskell的資源(eta縮減,符號中綴操作符,庫等)

  • 做ETA消除儘可能
  • 避開括號贊成利用運算符優先級
  • 包一半的邏輯放到超負荷,非字母數字綴運營商
的bucketloads的

最後一個特別困難,因爲有這麼多預定義的操作符,每個都有自己的約定和一般的語義,經常閱讀Haskell成爲Hoogle和:type的練習。

是否有任何優秀的教程假設CS /功能概念的知識,而是專注於Haskell特定的習語?我正在尋找像真實世界Haskell這樣的東西,它以一個非常幼稚,明確的程序開始,然後逐漸將其轉化爲一種更習慣的風格,隨着它的出現向人們介紹和解釋這些習語。但不是介紹和解釋像monad和類型類這樣的一般概念,而是引入特定的monads和特定的類型類,例如「但這正是替代monoid所做的!」

+1

我想學習如何字面上「讀」haskell是學習如何閱讀haskell的意義大幫:http://stackoverflow.com/questions/7746894/are-there-pronounceable-names-for-common- haskell-operators – sclv

+1

另外,您可能需要查看[連接語言](http://en.wikipedia.org/wiki/Concatenative_programming_language),例如[Factor](http://en.wikipedia.org/wiki/Factor_%28programming_language%29)以及[pointfree](http://hackage.haskell.org/package/pointfree)Haskell軟件包,以告知您的能力和願望以無點式編寫。 –

+0

[斯坦福講義](http://www.scs.stanford.edu/11au-cs240h/notes/)和[ezyang page](http://ezyang.com/haskell.html)非常有幫助 –

回答

24

基本型類,如ShowEqOrd應該很容易通過閱讀Hoogle和/或Haskell-2010 Language Report發現庫文檔把握。

Haskell中數字塔似乎令人費解(Int類型是百日咳根據報告11個型類的實例),但它僅僅是支持所有有用的各種數字和多次交涉發明了我們的數學家:例如Integer是一個任意大小的整數,Int是通常的機器字大小的整數,並且整數的惰性Peano表示(不在標準庫中)在圖算法的實現中被證明是有用的。最重要的數值類型是NumIntegral。您可以使用fromIntegral函數在不同的整數類型之間進行轉換。還請注意,諸如123的數字的類型爲Num a => a,並且存在特殊類型的默認機制,旨在減少類型聲明的需要以指定您需要的確切數字類型。在高級使用情況下,這會對您產生不利影響,因此您可能需要更改默認設置。

同樣的情況是不同類型的字符串:沒有單一的表示適用於所有,所以很多人都在野外:StringData.ByteStringData.Text是最重要的。

關於更復雜的類型,最好的來源是Typeclassopedia

對於某些類型的類,如Monad,ApplicativeArrow有很多專門的教程和研究工作。根據您的數學技能,您可能還想閱讀關於類型理論背後的類別理論概念的原始研究論文,例如Eugenio Moggi出色的「計算和單子概念」。

至於「eta減少」,它被稱爲Point-Free Style。您可以從 獲得該鏈接中提及的參考信息。您還可以查看John Backus Can programming be liberated from von neumann style?和APL編程語言1978年發表的Combinatory Logic,以獲得更加豐富的無點式歷史觀點。

也有一些關於Haskell的一般書籍,例如'Haskell簡介'和'瞭解你對Haskell的好處'。

至於運算符優先級 - 真的有少數運營商,你必須記住:(.)($)(>>=)使用比一切更(除非當然算術,但算術運算符是相當令人吃驚)。

元組和列表的語法對我來說似乎也不成問題。它只是多餘的:foo : bar : [][foo, bar]相同,而(,) foo bar(foo, bar)相同。很少使用較高級別的元組的前綴版本,例如(,,,,)

另請參見http://www.haskell.org/haskellwiki/Section_of_an_infix_operator,以瞭解結構的說明,例如(+ 2)(2 +)被稱爲章節。

此外,您可以從HLint工具建議改進您的代碼的變化中學習。 HLint可執行文件可以通過cabal install HLint進行安裝。對於高級主題,我可以推薦學習純粹的功能數據結構(讓你設計高效的不可變數據結構和關於時間消耗的原因),根據需要調用lambda微積分(可以讓你推理什麼是評估和按什麼順序) ,System Fc類型系統(給你一些關於haskell類型檢查器工作的背景),指稱語義(關於非終止,偏度和遞歸的推理,以及對嚴格性,純度和可組合性概念的一些洞察)。

+1

+ 1爲HLint,這是一個偉大的工具。 – augustss

+1

好貼!一個錯字,你的意思是:'foo:bar:[]'和'[foo,bar]'相同' –

+0

已修復,謝謝 – nponeccop

6

我認爲"Write Yourself a Scheme in 48 Hours"教程正是你正在尋找的。本教程介紹瞭如何在Haskell中實現Scheme解釋器;這是真正讓所有東西都能點擊的文檔。

它具有各種哈斯克爾成語和想法的具體例子,所有這些成語彙集在一個很酷的項目中。對於有Lisp經驗的人來說,這尤其有益,特別是如果你已經閱讀過SICP之類的東西,或者之前已經實現了Scheme解釋器。本教程無論如何都很棒,但如果您之前做過類似的事情,可能會更容易一些。