【问题标题】:Haskell list comprehension doesn't workHaskell 列表理解不起作用
【发布时间】:2016-12-22 00:09:34
【问题描述】:

这是我在 Haskell 中所做的列表理解:

[x|x <- [1..], n <- [1..], n <= 10, n >= 1, x == ((7 * n) + 4)]

我希望它打印出 4 mod 7 的前 10 个自然数,但是当我执行它时,它不会打印出任何东西并且永远不会终止。为什么?

【问题讨论】:

  • 如果xn 都无限增长,它怎么会终止?
  • 知道n是从单调递增的列表中提取的,但编译器不知道。
  • Vincent:这就是为什么我有 n 的上限和下限。
  • 编译器必须检查n 的每一个潜在值,以确保这些界限成立。仅仅因为它发现n一个 值大于10 并不意味着下一个可能不是。
  • 如果删除x == 子句会打印什么?为什么?

标签: haskell list-comprehension


【解决方案1】:

编译器不会推断n &lt;- [1..], n&lt;=10, n &gt;=1 等同于n &lt;- [1..10]。该代码将永远从[1..] 中愉快地提取n 的值,并根据守卫n &lt;= 10n &gt;= 1 验证是否应该使用每个值。 n &lt;- [1..10] 无需对 n 进行进一步测试就足够了,但如果您想明确一点,请尝试类似

[x|x <- [1..], n <- takeWhile (<= 10) [1..], x == ((7 * n) + 4)]

从单独的列表中提取x 并将它们与n 的函数进行比较也是低效的。您可以仅从n 构建您的列表:

[ 7*n + 4 | n <- [1..10] ]

【讨论】:

  • 好的。这解释了很多。非常感谢:)
猜你喜欢
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多