我是Haskell的新手,并且学习列表理解。从我从示例中看到的,我正在尝试执行以下代码
[ w :: Integer | x <- [1..10], y <- [1..10], z <- [1..10], w == x*2 + y*2 + z*2, w < 20]
但是,我收到以下错误:
:66:3:错误:变量不在范围内:w :: Integer
:66:60:错误:变量不在范围内:w :: Integer
:66:82:错误:变量不在范围内:w :: Integer
我已经搜索了问题的原因,并且从this问题来看,问题似乎是Haskell不知道变量的类型,但是在我的代码中,我正在定义它(正如我们所做的那样)我们正在做数学),但问题仍然存在,所以这种定义有什么问题,我们如何解决呢?
请注意,尝试执行这段代码的全部目的只是为了学习如何使用与数学中使用相同的符号来进行列表理解。
答案 0 :(得分:5)
条件w == x*2 + ...
检查已定义的变量w
是否等于x*2 + ...
。如果您想在那里定义w
,则需要let w = x*2 + ...
。
[ w :: Integer
| x <- [1..10], y <- [1..10], z <- [1..10], let w = x*2 + y*2 + z*2, w < 20]
GHCi演示:
> [ w :: Integer | x <- [1..10], y <- [1..10], z <- [1..10], let w = x*2 + y*2 + z*2, w < 20]
[6,8,10,12,14,16,18,8,10,12,14,16,18,10,12,14,16,18,12,14,16,18,14,16,18,16,18,18,8,10,12,14,16,18,10,12,14,16,18,12,14,16,18,14,16,18,16,18,18,10,12,14,16,18,12,14,16,18,14,16,18,16,18,18,12,14,16,18,14,16,18,16,18,18,14,16,18,16,18,18,16,18,18,18]