为什么我不能在Haskell中这样做?
[a * b | a <- [0..b], b <- [0..10]]
error: Variable not in scope: b
如果使用列表理解无法做到这一点?还是我可以做些什么来达到目标?
答案 0 :(得分:11)
“提取”是从左到右处理的,因此,当您尝试获取a
的值时,b
还没有定义。
列表理解只是以下单子代码的语法糖,这使得更容易了解为什么b
不在范围内。
-- [a * b | a <- [0..b], b <- [0..10]]
[0..b] >>= \a -> [0..10] >>= \b -> return (a * b)
将其翻转,b
进入范围:
-- [a * b | b <- [0..10], a <- [0..b]]
[0..10] >>= \b -> [0..b] >>= \a -> return (a*b)
答案 1 :(得分:4)
b
必须在[0..b]
部分之前的范围内:
[a * b | b <- [0..10], a <- [0..b]]