这是我在Haskell中所做的列表理解:
[x|x <- [1..], n <- [1..], n <= 10, n >= 1, x == ((7 * n) + 4)]
我希望它打印出4个mod 7的前10个自然数,但是当我执行它时,它不打印任何东西而且永远不会终止。为什么呢?
答案 0 :(得分:5)
编译器不会推断n <- [1..10]
等同于n
。代码将永远从[1..]
快速提取n <= 10
的值,并根据警卫n >= 1
和n <- [1..10]
验证每个值是否应该使用n
。对[x|x <- [1..], n <- takeWhile (<= 10) [1..], x == ((7 * n) + 4)]
进行进一步测试的x
就足够了,但如果你想要明确,请尝试类似
n
从单独的列表中提取n
并将它们与[ 7*n + 4 | n <- [1..10] ]
的函数进行比较也是低效的。您只需从brew install gnuplot
单独构建列表:
PATH