gpt4 book ai didi

haskell - 从无限列表创建元组

转载 作者:行者123 更新时间:2023-12-01 10:34:46 26 4
gpt4 key购买 nike

试图解决this challenge时我偶然发现了一些我自己无法解释的事情。

首先我生成一个无限的素数列表,如下所示:

primes = [n|n<-[2..],product[1..n-1]`rem`n==n-1]

这具有推断类型 [Integer],因此 Int 溢出应该不是问题。

然后我尝试生成后续素数的二元组(目标:[(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)] 一切按定义工作。

最佳答案

添加f强制你的质数类型为 Int ,它在阶乘运算期间确实会溢出。推理是这样的:

  1. take :: Int -> [a] -> [a]
  2. f n , 使用take n p部队 n :: Int .
  3. 因为 order 的参数必须具有相同的类型,调用 order r norder s nr, s :: Int .
  4. (r, s) <- 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 步。

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

关于haskell - 从无限列表创建元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37631576/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com