Haskell - 單子



單子不過是一種具有額外功能的應用函子型別。它是一種型別類,支配著被稱為單子規則的三個基本規則。

所有三個規則嚴格適用於一個如下所示的單子宣告:

class Monad m where  
   return :: a -> m a 
   (>>=) :: m a -> (a -> m b) -> m b 
   (>>) :: m a -> m b -> m b 
   x >> y = x >>= \_ -> y 
   fail :: String -> m a  
   fail msg = error msg 

適用於一個單子宣告的三條基本定律如下:

  • 左同一律 - return 函式不改變值,它不應改變單子中的任何內容。它可以表示為“return >=> mf = mf”。

  • 右同一律 - return 函式不改變值,它不應改變單子中的任何內容。它可以表示為“mf >=> return = mf”。

  • 結合律 - 根據此定律,函子和單子例項都應以相同的方式工作。它可以用數學表示式“(f >==>g)>=> h =f >= >(g >=h)”表示。

前兩條定律重複了同一觀點,即在 bind 運算子的兩側,return 應具有恆等行為。

在以前面的示例中,我們已經使用了大量單子,而沒有意識到它們是單子。考慮採用列表單子生成特定列表的以下示例。

main = do
   print([1..10] >>= (\x -> if odd x then [x*2] else []))

此程式碼將產生以下輸出:

[2,6,10,14,18]
廣告