具有多个参数的列表理解

时间:2019-03-19 03:30:58

标签: haskell functional-programming list-comprehension

为什么我不能在Haskell中这样做?

[a * b | a <- [0..b], b <- [0..10]]

error: Variable not in scope: b

如果使用列表理解无法做到这一点?还是我可以做些什么来达到目标​​?

2 个答案:

答案 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]]