爲了更好地理解monad,我試圖寫我自己的。我從一些非一元代碼開始,可以使用一些幫助將它翻譯成單元。Haskell:翻譯爲Monad
這個人爲的例子的基本思想:對於計算的每個整數結果,我想跟蹤該整數是偶數還是奇數。例如,在4 + 5 = 9
中,我們可能會返回(9, Odd)
。我想用>>=
連鎖/組合計算。例如:
return 1 >>= (+2) >>= (+5) >>= (+7) =result=> (15, Odd)
現在,我有以下的非單一產品代碼:
data Quality = Odd | Even deriving Show
qual :: Integer -> Quality
qual x = case odd x of
True -> Odd
_ -> Even
type Qualifier = (Integer, Quality)
mkQ :: Integer -> Qualifier
mkQ x = (x, qual x)
plusQ :: Qualifier -> Qualifier -> Qualifier
plusQ (x, _) (y, _) = (x+y, qual (x+y))
chain = plusQ (mkQ 7) . plusQ (mkQ 5) . plusQ (mkQ 2)
有什麼辦法我能翻譯上面的代碼放到一個單子?我應該尋找哪些模式以及它們的常用翻譯模式是什麼?
非常感謝提前!
這不容易承認一元翻譯。 Monads通過類型進行參數化,對任何類型都有意義。 Yor計算只對內部人員有意義。 –
看起來你正在試圖模擬狀態轉換/動作,在這種情況下,你的狀態就是「質量」。你會想看看[** State Monad **](http://learnyouahaskell.com/for-a-few-monads-more),其中你的狀態monad是由「Quality」和你的操作參數化的, (+1)'會變成狀態行爲。 – aaronlevin
@ n.m。好點,也是我開始看到和想知道的。什麼可能是一個簡單的,通用的過程的更好的例子,適合這樣的練習? –