單子_(函數式編程)

在函數式編程中 ， 單子 （ monad ） 是一種抽象 ， 它允許以泛型方式構造程序 。 支持它的語言可以使用單子來抽象出程序邏輯需要的 。 爲了達成這個目標 ， 單子提供它們自己的數據類型 （ 每種類型的單子都有特定的類型 ） ， 它表示一種特殊形式計算 ， 與之在一起的有兩個過程 ， 一個過程用來包裝單子內 “ 任何 ” 基本類型的值 （ 產生單子值 ） ， 另一個過程用來那些輸出單子值的函數 （ 叫做單子函數 ） 。 單子的概念和術語二者最初都來自範疇論 ， 這裏的單子被定義爲具有額外結構的函子 。 開始於1980年代晚期和1990年代早期的研究 ， 確立了單子可以將看似完全不同的計算機科學問題置於一個統一的函數式模型之下 。 範疇論還提供了叫做單子定律的一些形式要求 ， 任何單子都應當滿足它並可以用它來驗證單子代碼 。 通過單子 ， 編程者可以把複雜的函數序列變成簡潔的管道 ， 它抽象出了輔助數據管理 、 控制流或副作用 。 單子可以簡化範圍寬廣的問題 ， 比如處理潛在 （ 通過Maybe單子 ） ， 或將值保持在一個靈活而形式正確的列表中 （ 使用List單子 ） 。 因爲單子使得某種計算的語義明確 ， 它們還可以用來實現便捷的語言特徵 。 一些語言比如Haskell ， 甚至在它們的核心庫中爲通用單子結構提供預製的定義和常用實例 。