从Haskell中的列表返回序列的第一次迭代

从Haskell中的列表返回序列的第一次迭代,haskell,math,functional-programming,Haskell,Math,Functional Programming,我有一个序列数组,具有无限迭代(例如[6,6,6,6,6]或[23,24,23,24]或[1,2,3,4,1,2,3,4]) 如何在Haskell中遍历每个这样的列表,并只返回第一次迭代?对于上述示例:[6];[23, 24]; [1,2,3,4] 谢谢 编辑:对不起,我说得不准确。这些名单确实是不完整的。我的目标是返回给定整数的等分序列列表。我有一个函数,它返回除数的和。我用第一个和启动了一个递归调用,并构建了列表。这导致了类似于[6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6

我有一个序列数组,具有无限迭代(例如[6,6,6,6,6]或[23,24,23,24]或[1,2,3,4,1,2,3,4]) 如何在Haskell中遍历每个这样的列表,并只返回第一次迭代?对于上述示例:[6];[23, 24]; [1,2,3,4]

谢谢

编辑:对不起,我说得不准确。这些名单确实是不完整的。我的目标是返回给定整数的等分序列列表。我有一个函数,它返回除数的和。我用第一个和启动了一个递归调用,并构建了列表。这导致了类似于[6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6…]的列表

首先,我想通过获取列表的第一部分来解决这个问题,直到原始Int的第二次出现。但我突然想到:如果列表中存在求和,则使用
elem
更容易检查。如果是,请按原样返回列表。否则,追加总和并继续

编辑2:生成(至少在我的定义中)无限列表的代码如下:

aliquot :: (Integral a) => a -> [a]
aliquot 0 = []
aliquot 1 = [1]
aliquot n = n : (aliquot $ sum $ divisors n)

divisors :: (Integral a) => a -> [a]
divisors n = filter ((0 ==) . (n `mod`)) [1 .. (n `div` 2)]

这是不可能的。考虑这个序列:<代码> [1,1,1,1,1,1,1…< /代码>,看起来这里的答案是<代码> [1 ] < /代码>,对不对。这个序列实际上是(x^ 17+9)和((x+1)^ 17+9)的最大公因子。当你到达8424432525989329、8319782230962459420460792433 RD元素时,它停止所有1s,或者考虑其他序列:<代码>[1,1,1,1,1,1,1,1…。世界上最伟大的数学家不确定这个序列的答案是什么。这是Collatz序列对每个起始值所达到的最小数字,尽管我们从未找到一个不是1的数字,但我们无法证明它对所有数字都是1。

@Willence I d我不认为这个问题是你认为它说的。这是一个家庭作业吗?如果是的话,你能逐字引用作业吗?这里的问题比你能解决的问题还要多。等分序列不能超过1,因为1的适当除数之和是0。23的适当除数之和是
1
。适当除数之和是0f
24
36
。等分序列不一定是周期性的,但可能有一个不重复的初始子序列(95,25,6,6…).我知道,这只是我在网上找到的一个起点。我可以解决这些问题-我在这里问的问题简单明了。我一开始就没有遇到这个问题就解决了。我在Q.@n.m.中更新了问题“无限迭代”中的代码作业中可能会规定,一旦再次看到之前看到的元素之一,我们可能会假设已检测到循环。也就是说,这可能是对输入数字的限制。或者可能是OP没有正确使用“无限”一词。也许正确的词是“无限”。我不知道,也许OP可以插话回答我在评论中提出的问题。否则,这是一个相当徒劳的努力。目前的问题将两个截然不同的问题混为一谈,一个是琐碎的问题(如何映射列表),另一个是较少的问题(如何从(有限?)周期序列中提取周期)。此类问题通常不会在入门课程中作为作业出现。可能OP将其误译为。它确实是一个无限列表。如果您在hugs中调用该函数,您可以在控制台打印[6,6,6,…]永远。这不是无限的定义吗?如果我将列表传递给另一个函数,它会导致SO@schoeberlt拥抱在过去10年左右已经过时了。