簡體   English   中英

在單子學習之后學習Haskell的下一步是什么?

[英]What's the next step to learning Haskell after monads?

我一直在逐漸學習Haskell,甚至覺得我有很多單子。 但是,還有很多我幾乎不了解的異國情調的東西,例如Arrows,Applicative等。盡管我從我所見過的Haskell代碼中拾取了點點滴滴,但是找到一個真正可以解釋說明的教程會很好他們全部。 (似乎有數十個有關monad的教程。但是一切似乎都在此之后馬上完成!)

在“掌握”單子之后,我發現了一些有用的資源:

最重要的是,深入了解您使用的任何Hackage庫的代碼。 如果他們正在使用您不了解的語法,慣用語或擴展名做某事,請查找它。

關於類型類:

  • Applicative實際上比Monad更簡單。 我最近其他地方說了一些有關它的內容 ,但是要點在於,它是關於增強的Functor的,您可以將函數引入其中。 為了獲得Applicative的感覺,您可以嘗試使用Parsec編寫某些東西而無需使用do表示法-我的經驗是,對於簡單的解析器,applicative風格比monadic更好。

  • Arrow是一種非常抽象的處理類似函數的方法(類型之間的“箭頭”)。 在您偶然發現Arrow類的東西之前,很難讓他們動腦子。 一方面,在編寫帶有反饋循環的交互式狀態機時,我(嚴重地)重塑了Control.Arrow一半。

  • 您沒有提到它,但是謙虛的Monoid是經常被低估,功能強大的類型類。 很多地方都可以找到類恐龍的結構。 例如,看一下monoids包


除了類型類,我還會為您的問題提供一個非常簡單的答案: 編寫程序! 最好的學習方法就是做事,所以選擇一些有趣或有用的東西,然后使之成為現實。

實際上,如果您以后再回來找它們,發現許多更抽象的概念(例如Arrow可能更有意義,像我一樣,它們為您遇到但沒有遇到的問題提供了一個整潔的解決方案甚至可以抽象出來。

但是,如果您想要拍攝一些特定的東西,為什么不看一下函數式反應式編程-這是一門有很多前景的技術,但是對於最佳方法,還有很多未解決的問題它是。

諸如MonadApplicativeArrowFunctor類型類非常有用,而且對於改變代碼的思維方式也非常重要,而不是使函數具有泛型的便利。 但是,有一個普遍的誤解,認為Haskell的“下一步”正在學習更多類型類和構造控制流的方法。 下一步是確定要編寫的內容,並嘗試編寫它,並一路探索所需的內容。

即使您了解Monads,也並不意味着您已經摸索了用Monadally結構化代碼可以做的事情的表面。 使用解析器組合器庫,或編寫自己的庫。 探索為什么有時應用符號對他們來說更容易。 探索為什么將自己限制為應用解析器可能更有效。

查看邏輯或數學問題,並探索實現回溯的方式-深度優先,寬度優先等。探索ListT與LogicT和ChoiceT之間的區別。 看一下延續。

或者做一些完全不同的事情!

毫無疑問,您可以做的最重要的事情就是探索更多的Hackage。 掌握Haskell的各種異國特色可能會讓您找到某些問題的改進解決方案,而Hackage上的庫將極大地擴展您的工具集。

Haskell生態系統最好的部分是,您可以在學習精確的外科手術新抽象技術與如何在Hackage上使用可用的巨型電鋸之間取得平衡。

開始編寫代碼。 您將在學習過程中學習必要的概念。

除了語言之外,要有效地使用Haskell,您還需要學習一些實際的工具和技術。 注意事項:

  • Cabal ,一種用於管理依賴關系,構建和部署Haskell應用程序的工具*
  • FFI(外部功能接口)以使用Haskell代碼**中的 C庫。
  • 黑客作為他人圖書館的資源。
  • 如何分析和優化
  • 自動測試框架(QuickCheck,HUnit)。

*) cabal-init有助於快速啟動。

**)目前,我最喜歡的FFI綁定工具是bindings-DSL

作為一個下一步(而不是六個“下一步”),我建議您學習編寫自己的類型類。 這里有一些簡單的問題可以幫助您入門:

  • 為QuickCheck編寫一些有趣的實例聲明。 舉例來說,您要生成某種“有趣”的隨機樹。

  • 繼續解決以下小問題:定義函數/\\\\/complement (“ and”,“ or”和&“ not”),這些函數不僅可以應用於布爾值,而且可以應用於任意arity的謂詞。 (如果仔細看,您可以在SO上找到答案)。

您知道編寫代碼所需的一切。 但是,如果您正在尋找更多需要了解Haskell-y的知識,我可以建議:

  • 類型家庭。 非常方便的功能。 它基本上為您提供了一種在類型級別上編寫函數的方法,當您嘗試以非常精確的方式編寫其參數為多態的函數時,此方法非常方便。 這樣的例子之一:


data TTrue = TTrue
data FFalse = FFalse

class TypeLevelIf tf a b where type If tf a b weirdIfStatement :: tf -> a -> b -> tf a b

instance TypeLevelIf TTrue a b where type If TTrue a b = a weirdIfStatement TTrue a b = a

instance TypeLevelIf FFalse a b where type If FFalse a b = b weirdIfStatement FFalse a b = a

這為您提供了一個功能類似於if語句的函數,但是能夠根據給定的真值返回不同的類型。

如果您對類型級編程感到好奇,則類型族可為該主題提供一種途徑。

  • 模板Haskell。 這是一個巨大的課題。 它提供的功能類似於C中的宏,但具有更多的類型安全性。

  • 了解一些領先的Haskell庫。 我無法計算出parsec使我能夠快速編寫一個非常有用的實用程序的次數。 dons定期發布有關黑客的熱門圖書館列表; 檢查一下

編寫一個haskell編譯器:-)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM