gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:13:30 25 4
gpt4 key购买 nike

我试图理解 Monads 的概念,并遇到了这个列表理解语法,用于从 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 的空列表在这种情况下会起作用。 (这意味着“(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?
  • Why is guard based on Alternative ?
  • The List monad - Learn You a Haskell for Great Good!
  • List comprehension translations - Haskell Report 2010
  • 关于haskell - List Monads do-notation 中的 If-Then-Else,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62273828/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com