簡體   English   中英

在實踐中使用monad,monoids,functor和箭頭

[英]Using monads, monoids, functors and arrows in practice

我最近在這篇文章中遇到了關於函數式編程不同方面的有用資源,比如monad和monoids等。

但問題是 - 普通程序員可以用這些概念做些什么。 我經常對這些問題進行“學術”研究。 但是,我從未在實踐中(在實際項目中)遇到任何人使用它們。

所以問題是 - 在Haskell中是否有任何廣泛使用的開源項目真正利用這些東西,這些項目在“生產”軟件中證明了這一概念的實際必要性,而不是在“學術”軟件中寫的“純娛樂”。 制作這樣的列表會很酷:

  • Monads - 在A和B等項目中使用,因為否則這樣的代碼看起來會復雜得多。
  • 幺半群也一樣。
  • 仿函數也一樣。
  • 箭頭也一樣。

其中許多概念在Haskell代碼中是如此隱含,因此更容易列出不使用它們的示例(假設您可以找到一個)。 每個Haskell程序都使用monad,至少對於IO。

所有這些都被廣泛使用,因為它們是在代碼中經常出現的抽象。 考慮仿函數:對容器進行映射是一個相當普遍的需求,因此為任何類似容器的數據結構提供單一接口是有意義的,這正是Functor提供的。 碰巧甚至“容器”的概念比仿函數抽象更具體,但希望這證明了這一點。

Monads: XMonad窗口管理器是一個廣泛使用的程序,它廣泛使用monad變換器和拉鏈結構 STM是一個為新monad提供有用屬性的庫。

Monoids: containers包中的Sequence結構使用monoids實現 此外,monoids被廣泛用於模型集,列表和類似,因為兩個monoid操作提供空列表和連接(或空集和聯合)。

箭頭: YampaHXT (Haskell XML Toolbox)立即浮現在腦海中。

Functors到處出現。 monadic代碼有很多<$> s是很常見的,這意味着Functor實例正在使用中。 大多數 Haskell 解析器都大量使用仿函數。

我正在為現實世界的應用程序高效地使用箭頭和單子(以及編碼器)。 我的功能反應式編程(FRP)庫Netwire結合了您提到的所有四個概念以及更多,而FRP本身也是一種設計模式,您通常從學術界知道。 這些是使用的概念:

  • 箭頭和箭頭變換器:Netwire提供Wire類型,它是一個箭頭變換器。
  • Monads和monad變換器: Wire通常KleisliKleisli箭頭包裹的monad變換器。
  • 線路抑制(如異常或未發生事件)使用幺半群。

版本3即將發布(我希望今天),它還會將(非關聯)類型系列帶入游戲中。

Ertes的答案以及John L's都很棒。 我只是想添加一些關於仿函數和幺半群的東西:我相信大部分Haskell術語雖然精確,但對於新的Haskell程序員來說可能有些偏見。 我總是告訴新人,monoids可以被認為是“appendables”,而functor可以被認為是“mappables”。 顯然,這種簡化會有一些損失,但它有助於克服語言的最初詞匯障礙。 monoid接口(類型類)具有“append”和“identity”函數,而functor只指定了map函數。 長期追加和映射的概念之間存在一些滑點(例如總和是一種附加),但基本思想仍然存在。

作為附加和映射的簡單接口,monoids和functors很快就會發現它們有很多用途:只要你的數據結構需要支持追加或映射,你就有時間使你的數據strcuture成為monoid或functor的實例可以簡化這個過程。

希望這很有幫助。

接下來,這是您要詢問的庫列表。

函數:查看像attparsec這樣的解析庫。 http://hackage.haskell.org/package/attoparsec-0.10.0.2 Functors允許您輕松編寫解析器,以便您可以編寫易於編寫,易於閱讀的解析器,甚至可以編寫復雜的數據。 將attoparsec解析器與可比較的正則表達式進行對比!

Monoid:查看任何數組,矢量庫( http://hackage.haskell.org/packages/archive/vector/0.9/doc/html/Data-Vector.html ),看看Monoid用於實現monoids的可附加性。 此外,這是一篇很棒的文章,可以讓monoids為你工作http://blog.sigfpe.com/2009/01/haskell-monoids-and-their-uses.html

Monads:查看Data.Binary - 一個簡單而基本的Haskell庫 - 用於Monads的完美用例。 http://hackage.haskell.org/packages/archive/binary/0.4.1/doc/html/Data-Binary.html通過使用monad,您可以編寫復雜的指令系列,以幾乎必須的方式解析二進制文件。

暫無
暫無

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

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