【问题标题】:creating tuples from infinite list从无限列表创建元组
【发布时间】: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&gt; 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


【解决方案1】:

添加f 会强制您的素数具有Int 类型,这在阶乘运算期间会溢出。推理是这样的:

  1. take :: Int -&gt; [a] -&gt; [a]
  2. f n 中,使用take n p 会强制n :: Int
  3. 因为order 的参数必须具有相同的类型,所以调用order r norder s n 强制r, s :: Int
  4. (r, s) &lt;- take n p部队p :: [(Int, Int)]
  5. p = listtotuples primes 部队primes :: [Int]

简单的修复包括打破上面的第 2 步或第 3 步;使用take (fromInteger n) p 中断第2 步或order s (fromIntegral n)order r (fromIntegral n) 中断第3 步。

...现在您知道为什么添加顶级类型签名被认为是最佳实践了。 =)

【讨论】:

  • 非常感谢您的回答(以及您的耐心)!我现在知道我应该更多地检查我的类型。 (但是类型签名在 code-golf 中太浪费了 =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 2017-03-21
  • 1970-01-01
  • 1970-01-01
  • 2019-03-15
  • 1970-01-01
相关资源
最近更新 更多