gpt4 book ai didi

list - 理解守卫功能和列表理解

转载 作者:行者123 更新时间:2023-12-01 06:50:44 25 4
gpt4 key购买 nike

我正在了解 guard 'Learn You a Haskell for Great Good!' 一书中的函数通过米兰利波瓦卡。

对于以下示例:

ghci> [1..50] >>= (\x -> guard('7' `elem` show x) >> return x)
[7, 17, 27, 37, 47]

我知道 guard取一个 bool 值,如果值为 True ,守卫需要 ()并将其置于最小的默认上下文中并成功。
如果值为 False ,然后 guard生成一个失败的 monadic 值。

但是,我不明白在上面的示例中,guard 如何工作以创建结果列表 [7, 17, 27, 37, 47] .什么传为 x在 lambda 函数中,它是 1 吗?此外,如果 ('7' `elem` show x)评估为 False ,那么不会返回空列表吗?最终的结果列表究竟是如何形成的?

最佳答案

在列表中 Monad实例:

  • >>=concatMap参数翻转
  • guard condition相当于 if condition then [()] else []

  • 并在任何 Monad实例, a >> b = a >>= \_ -> b ,所以在列表实例中这等价于 concatMap (\_ -> b) a .

    因此,您的代码对此进行了脱糖:
    concatMap
    (\x -> concatMap
    (\_ -> [x])
    (if '7' `elem` show x then [()] else []))
    [1..50]

    所以外 concatMap生成一个包含 50 个元素的列表作为中间值,每个元素都是一个列表,如果其字符串表示包含数字 7,则它是输入值的单例列表。 , 否则为空列表:
    [[], [], [], [], [], [], [7], [], [], [], [], [], [], [], [], [], [17], …]

    然后将其连接起来以产生最终结果 [7, 17, 27, 37, 47] .

    What is passed as x in the lambda function, is it 1?



    它是输入列表的每个元素, 1通过 50 .

    内部 concatMap生产 [x]如果条件为真且 []如果条件为假,因为 guard如果条件为真,则生成一个包含一个元素的列表(虚拟 ()),如果条件为假,则生成一个空列表——如果您将其重新表述为等效项,则可能更容易看出:
    map (\_ -> x) (if '7' `elem` show x then [()] else [])
    -- or
    if '7' `elem` show x then [x] else []

    关于list - 理解守卫功能和列表理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57351063/

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