Haskell 从无限列表创建元组

Haskell 从无限列表创建元组,haskell,Haskell,在试图解决问题时,我偶然发现了一些我无法解释的事情 首先,我生成一个无限素数列表,如下所示: primes = [n|n<-[2..],product[1..n-1]`rem`n==n-1] 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..

在试图解决问题时,我偶然发现了一些我无法解释的事情

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

primes = [n|n<-[2..],product[1..n-1]`rem`n==n-1]
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]
奇怪的是,这个
listtotuples
函数在例如
[0..]
上似乎工作得很好,但当我将它应用于
素数时,它就停止工作了,输出刚好(中断后)

我不明白为什么会这样,有人能解释一下吗

编辑:这不仅在尝试输出无限列表时发生,而且在前奏中使用
take 10$listtotuples primes
加载包含上面两行的文件后也会发生。它确实被卡在了完全相同的点上

我正在使用Windows 7和GHCi 7.10.2

EDIT2:我的文件的全部内容如下:

primes = [n|n<-[2..],product[1..n-1]`rem`n==n-1]
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]
顺序pm=头[n-1 | n0]

primes=[n | n添加
f
会强制您的primes具有类型
Int
,这在阶乘运算期间会溢出。推理如下:

  • take::Int->[a]->[a]
  • fn
    中,使用
    take np
    强制
    n::Int
  • 由于
    order
    的参数必须具有相同的类型,因此调用
    order rn
    order sn
    强制
    r,s::Int

  • (r,s)编写
    listToTuples-xs@(:xs')=zip-xs-xs'
    顺便说一句:我无法重现您的问题:
    Prelude>使用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谢谢你的提示(我显然还是个初学者)在我的电脑上,即使在使用<代码> 10个$Listtutuple Primes <代码>时,它仍然被卡在同一个点上。你使用什么OS/Vesto?@卡斯滕是的,这仍然不起作用。我确实更新了这个问题。PS:向投票的人关闭:为什么你把这个问题拒之门外?因为它的价值,我还没有。投票结束。我读了提议的理由(“打字错误/不可复制”)这意味着即使是发布问题的人也无法重现问题。仅仅因为我们无法重现问题并不意味着它不是问题——只是我们还没有以一种让我们重现问题的方式找出问题所在。我们可能需要更多的信息;但是,确切地说,什么?除非有人有具体的建议n对于遗漏的内容,我认为关闭的“no MWE”理由也不适用。非常感谢您的回答(以及您的耐心)!我现在知道我应该更多地检查我的类型。(但是类型签名在代码高尔夫中太浪费了=)