【问题标题】:Getting "Variable not in scope: w :: Integer" error while defining the type of "w"定义“w”类型时出现“变量不在范围内:w :: Integer”错误
【发布时间】:2018-03-09 12:33:30
【问题描述】:

我是 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 不知道变量的类型,但是在我的代码中,我正在定义它(就像我们在做数学),但问题仍然存在,那么这种定义有什么问题,我们该如何解决呢?

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

【问题讨论】:

  • w == x*2 + y*2 + z*2 没有定义w,但设置了一个涉及(未定义的)w 的相等检查。你的意思是let w = x*2 + y*2 + z*2。 (虽然如果您的预期公式是毕达哥拉斯公式,那么您实际上是指let w = x^2 + y^2 + z^2)。

标签: haskell functional-programming


【解决方案1】:

条件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]

【讨论】:

  • 某处逗号有问题
  • @onurcanbektas 我只是尝试将上述内容复制并粘贴到 GHCi 中,但我看不到任何错误。如果您有缩进错误(或缩进第二行),请将其保留在一行上。
  • 好吧,显然,我添加了一个额外的“=”。非常感谢您的回答。
猜你喜欢
  • 2021-01-05
  • 2018-01-17
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
相关资源
最近更新 更多