讓我們來看看Maybe
單子的定義。
instance Monad Maybe where
return = Just
Just a >>= f = f a
Nothing >>= _ = Nothing
而且desugar在功能do
-notation:
func' =
Nothing >>= \a ->
return a
的第一個參數是>>=
和Nothing
從上面的定義可以看出,>>=
只是忽略了第二個參數。所以我們得到:
func' = Nothing
由於功能\a -> ...
沒有被調用,a
永遠不會被分配。所以答案是:a
甚至沒有達到。
至於脫糖do
-notation,下面是它是如何做一個速寫(有一個簡化我做了 - 的fail
處理,即不匹配模式):
do {a; rest} → a >> do rest
請注意,>>
通常以>>=
作爲a >>= \_ -> do rest
(即第二個函數忽略參數)來實現。
do {p <- a; rest} → a >>= \p -> do rest
do {let x = a; rest} → let x = a in do rest
最後:
do {a} = a
下面是一個例子:
main = do
name <- getLine
let msg = "Hello " ++ name
putStrLn msg
putStrLn "Good bye!"
desugars到:
main =
getLine >>= \name ->
let msg = "Hello " ++ name in
putStrLn msg >>
putStrLn "Good bye!"
其中t Ø使其完全爲那些誰是好奇,這裏的「正確」翻譯do {p <- a; rest}
(直接從Haskell的報告採取的):
do {pattern <- a; rest} → let ok pattern = do rest
ok _ = fail "error message"
in a >>= ok
'<-'轉換爲'>> ='。對於'Maybe' monad,如果第一個參數(即'<--'的右邊部分)是'Nothing',則不計算其他值,而>> >> ='只返回'Nothing'。所以,要回答你的問題:執行甚至不會_reach_'a'。 – Vitus 2012-04-18 07:41:51
將monad視爲容器,使用do-notation可以將標籤分配給monads中的值(如果有),然後定義適用於這些值的函數。但是提取是一種幻想 - 函數被應用於monad_中(使用'>> ='),因爲沒有從monad中提取值的一般方法。請注意,如何通過將結果_back放入monad_中來結束每個do-block,通常使用'return'。你永遠不會真的有一個變量'a',等於5. – Nefrubyr 2012-04-19 13:38:17