[英]Haskell monads and the do statement
我是monads的新手,它的使用以及使用do語句的以下結構使我非常困惑:
pairs xs ys = do x <- xs
y <- ys
return (x, y)
有人告訴我這應該返回x和y的所有可能的對,我不明白,因為我之前被告知以下代碼:
eval (Val n) = Just n
eval (Div x y) = do n <- eval x
m <- eval y
safediv n m
意思是:執行eval x
,然后如果不等於Nothing
(否則返回Nothing)為n
,則保持其結果,然后對eval y
保持相同,然后如果兩者都不為Nothing
,它將繼續執行將兩個結果safediv
的最終函數safediv
(否則返回Nothing
)。
但是在函數pairs
第一次使用do語句的工作原理完全不同嗎?
如果有人可以幫助我解決這個問題,並解釋do語句及其結構的真正適當功能,將不勝感激!
最好的問候,Skyfe。
do
構造可在任何 monad中使用,並且在兩個不同的monad中使用它。
在第一種情況下,
pairs xs ys = do x <- xs
y <- ys
return (x, y)
您正在使用monad列表,即[]
。 可以看到,因為使用x <- xs
並且xs
的類型為[something]
。
在第二種情況下
eval (Val n) = Just n
eval (Div x y) = do n <- eval x
m <- eval y
safediv n m
您正在Maybe
monad工作。 確實,您使用y <- eval x
並且eval
返回Maybe something
。
每個monad都定義其有關<-
含義的規則。 在列表單子,它大致的意思是“考慮所有可能的因素”,在也許有“拿x
中Just x
,否則失敗。”
從技術上講, do
的<-
構造被減為對>>=
運算符的調用,每個monad獨立定義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.