If-Then-Else inside List Monads do-notation
If-Then-Else inside List Monads do-notation
我试图理解 Monad 的概念,并遇到了用于从 2 个列表中过滤总和的列表理解语法。
largeSums = [i+j | i <- [10, 20, 30], j <- [1 , 2] , (i+j)>20]
我正在尝试使用 do 符号重写它,但不明白 else
部分的内容:
largeSums = do
i <- [10, 20, 30]
j <- [1 , 2]
if i+j > 20
then return (i+j)
else
没有 return
的空列表在这种情况下可以工作。 (这意味着 'no result for this combination of (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 []
但是,使用 guard :: (Alternative f) => Bool -> f ()
更符合习惯。
import Control.Monad
largeSums = do
i <- [10, 20, 30]
j <- [1 , 2]
guard (i+j > 20)
return (i+j)
相关链接:
- How are list comprehensions implemented in Haskell?
- The List monad - Learn You a Haskell for Great Good!
- List comprehension translations - Haskell Report 2010
我试图理解 Monad 的概念,并遇到了用于从 2 个列表中过滤总和的列表理解语法。
largeSums = [i+j | i <- [10, 20, 30], j <- [1 , 2] , (i+j)>20]
我正在尝试使用 do 符号重写它,但不明白 else
部分的内容:
largeSums = do
i <- [10, 20, 30]
j <- [1 , 2]
if i+j > 20
then return (i+j)
else
没有 return
的空列表在这种情况下可以工作。 (这意味着 'no result for this combination of (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 []
但是,使用 guard :: (Alternative f) => Bool -> f ()
更符合习惯。
import Control.Monad
largeSums = do
i <- [10, 20, 30]
j <- [1 , 2]
guard (i+j > 20)
return (i+j)
相关链接:
- How are list comprehensions implemented in Haskell?
- The List monad - Learn You a Haskell for Great Good!
- List comprehension translations - Haskell Report 2010