【发布时间】:2016-06-04 14:53:02
【问题描述】:
在尝试解决 this challenge 时,我偶然发现了一些我自己无法解释的问题。
首先我生成一个无限的素数列表,如下所示:
primes = [n|n<-[2..],product[1..n-1]`rem`n==n-1]
这具有推断类型[Integer],因此 Int-overflow 应该不是问题。
然后我尝试制作后续素数的 2 元组(目标:[(2,3),(5,7),...])。为此,我编写了另一个函数:
listtotuples l=[ (l!!i, l!!(i+1) ) |i<-[0,2..]]
奇怪的是,这个listtotuples 函数似乎在例如[0..],但是当我将它应用到primes 时它就停止工作了,输出只是(中断后)
[(2,3),(5,7),(11,13),(Interrupted.
我不明白为什么会这样,谁能解释一下?
编辑:这不仅发生在尝试输出无限列表时,而且例如在从上面加载具有两行的文件后,在 Prelude 中使用 take 10 $ listtotuples primes。它确实卡在了完全相同的位置。
我正在使用带有 GHCi 7.10.2 的 Windows 7。
EDIT2:我的文件的完整内容如下:
order p m=head[n-1|n<-[0..],mod m (p^n)>0]
primes = [n|n<-[2..],product[1..n-1]`rem`n==n-1]
listtotuples l=[ (l!!i, l!!(i+1) ) |i<-[0,2..]]
p=listtotuples primes
f n=product[r^(order s n) * s^(order r n)|(r,s)<-take n p]
一旦我注释/删除最后一行(函数f,但我仍然认为这很奇怪,因为f 没有被调用并且与上面的函数没有任何关系,问题就消失了。此外,如果我将函数f 中的take n p 替换为[(2,3)],则一切正常。
【问题讨论】:
-
写
listToTuples xs@(_:xs') = zip xs xs'效率更高 -
顺便说一句:我无法重现您的问题:
Prelude> take 10 $ listToTuples primes [(2,3),(5,7),(11,13),(17,19),(23,29),(31,37),(41,43),(47,53),(59,61),(67,71)](将您的实现用于listToTuples)。 -
@Bakuriu 谢谢你的提示(我显然还是个初学者)。在我的电脑上,即使使用
take 10 $ listToTuples primes,它仍然会卡在完全相同的位置。您使用的是什么操作系统/版本? -
@Carsten 是的,这仍然不起作用。我确实相应地更新了问题。 PS:致投票结束的人:你为什么认为这个问题离题了?
-
对于它的价值,我还没有投票结束。我阅读了建议的原因(“错字/不可重现”)意味着即使发布问题的人也无法再重现问题。仅仅因为我们不能重现它并不意味着它不是问题——只是我们还没有弄清楚问题可能是什么让我们重现它。我们可能需要更多信息;但是,究竟是什么?除非有人对缺失的内容提出具体建议,否则我认为关闭的“无 MWE”理由也不适用。
标签: haskell