我正在学习Miran Lipovaca的《Learn You a Haskell for Great Good!》这本书中关于guard
函数的内容。
对于以下例子:
ghci> [1..50] >>= (\x -> guard('7' `elem` show x) >> return x)
[7, 17, 27, 37, 47]
我知道 `guard` 接受一个布尔值,如果该值为 `True`, `guard` 将使用最小默认上下文将 `()` 放入其中并成功。如果该值为 `False`,则 `guard` 生成失败的单子值。
然而,我不理解在上面的示例中 `guard` 如何创建结果列表 `[7, 17, 27, 37, 47]`。在 lambda 函数中传递的是什么作为 `x`,是1吗?此外,如果 `('7'`elem` show x)` 计算结果为 `False`,那么空列表将被返回吗?最终的结果列表是如何得到的?