List Monads do-notation 中的 If-Then-Else

Alp*_*lon 7 monads haskell

我试图理解 Monads 的概念,并遇到了这个列表理解语法,用于从 2 个列表中过滤总和。

largeSums = [i+j | i <- [10, 20, 30], j <- [1 , 2] , (i+j)>20]
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 do 符号重写它,但不明白else部件内部的内容:

largeSums = do
              i <- [10, 20, 30]
              j <- [1 , 2]
              if i+j > 20
               then return (i+j)
               else 
Run Code Online (Sandbox Code Playgroud)

sni*_*nip 6

return在这种情况下,没有空列表将起作用。(这意味着“ (i, j) 的这种组合没有结果”。另一方面,return (i+j)等于[i+j]

largeSums = do
              i <- [10, 20, 30]
              j <- [1 , 2]
              if i+j > 20
               then return (i+j)
               else []
Run Code Online (Sandbox Code Playgroud)

但是,使用guard :: (Alternative f) => Bool -> f ().

import Control.Monad
largeSums = do
              i <- [10, 20, 30]
              j <- [1 , 2]
              guard (i+j > 20)
              return (i+j)
Run Code Online (Sandbox Code Playgroud)

相关链接: