在定义"w"类型时获取"不在范围内变量:w :: Integer"错误

onu*_*tas 0 haskell functional-programming

我是Haskell的新手,并且学习列表理解.从我从示例中看到的,我正在尝试执行以下代码:

[ w :: Integer | x <- [1..10], y <- [1..10], z <- [1..10], w == x*2 + y*2 + z*2, w < 20]
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

:66:3:错误:变量不在范围内:w :: Integer

:66:60:错误:变量不在范围内:w :: Integer

:66:82:错误:变量不在范围内:w :: Integer

我已经搜索了问题的原因,从这个问题来看,问题似乎是Haskell不知道变量的类型,但是在我的代码中,我正在定义它(就像我们在做数学时那样),但是问题仍然存在,那么这种定义有什么问题呢?我们如何解决呢?

请注意,尝试执行这段代码的整个目的只是为了学习如何使用与数学中使用相同的符号来进行列表理解.

chi*_*chi 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]
Run Code Online (Sandbox Code Playgroud)

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]
Run Code Online (Sandbox Code Playgroud)