簡體   English   中英

Haskell monads和do語句

[英]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都定義其有關<-含義的規則。 在列表單子,它大致的意思是“考慮所有可能的因素”,在也許有“拿xJust x ,否則失敗。”

從技術上講, do<-構造被減為對>>=運算符的調用,每個monad獨立定義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM