Haskell 如何使用rational元素创建列表

Haskell 如何使用rational元素创建列表,haskell,Haskell,我尝试以下方法。函数cant::Int->Rational应该给出Rational类型列表的第n个元素 尤其是,列表以元素1/1开头,并具有以下属性: (假设a/b是分数,为了构造有理数,我使用模块Data.Ratio中的运算符%。因此,对于a/b,是写a%b。gcd是给我最大公约数的函数) 取第一个元素(1%1),使用上面的条件创建第二个元素,但是[(1%1)…]不起作用。 (我是如何来到[(1%1)]:在一些网站上,我看到[1,2,3,4,等等]的符号[1..],我用[(1%1)…]教学,这

我尝试以下方法。函数cant::Int->Rational应该给出Rational类型列表的第n个元素

尤其是,列表以元素1/1开头,并具有以下属性: (假设a/b是分数,为了构造有理数,我使用模块Data.Ratio中的运算符%。因此,对于a/b,是写a%b。gcd是给我最大公约数的函数)

取第一个元素(1%1),使用上面的条件创建第二个元素,但是[(1%1)…]不起作用。 (我是如何来到[(1%1)]:在一些网站上,我看到[1,2,3,4,等等]的符号[1..],我用[(1%1)…]教学,这是一样的)

我还没有找到其他的想法。有人能给我另一个策略吗?请不要使用代码,因为我想学习它,所以只有你的想法才是完美的…xD

编辑: 你好,谢谢你的回答。科拉茨的例子对我帮助很大。但对于解决方案,我使用了另一种想法。现在,我写下以下内容:

import Data.Ratio

list :: [Rational]
list = initial : map calculateNext list


calculateNext :: Rational -> Rational
calculateNext (a%b)                   | (a-b) == 0                     = a % (a+b)
                  | (a-b)<0 && (a+1) /= (b-1)      = (a+1)%(b-1)
                  | (a-b)>0 && (gcd a b == a || b) = (a-b)%(a+b)


initial :: Rational
initial = (1%1)
我想它无法理解,我试图用论点a%b来表达什么。。。?我说得对吗? 如果是,如何解决它以使其理解?

您可能会喜欢,并且您可以查看由提供的中给出的想法的实现。(给出了
(++)+
辅助函数的定义。)

为了完全满足您的要求,我建议查看
iterate
函数。将您提出的算法编写为只需一步的函数,然后将该函数传递给
iterate
,它将为您运行所有步骤。下面是一个类似算法的示例,让您了解我的意思。代替理性,我们将做Collatz序列——它很相似,但差异很大,不包含破坏者

Collatz序列是这样的:为了得到下一步,如果数字是偶数,则除以2;否则,将其增加三倍并添加一个。在代码中

collatzStep n
    | even n    = n `div` 2
    | otherwise = 3 * n + 1

collatz n = iterate collatzStep n
通过在ghci中运行以下命令,可以看到从(比如)30开始的Collatz序列:

*Main> take 10 (collatz 30)
[30,15,46,23,70,35,106,53,160,80]

这可以通过简单的递归模式实现:

list = initial : map calculateNext list

在这种情况下,
initial==1%1
,和
calculateNext
将是您在上面用
if
语句概述的代码。

关于
[1..
符号:它只适用于类型类实例的类型,而不是
Rational
(它只是一个同义词)的情况。即使存在预定义的实例,也只有当
succ
函数实际给出了Cantor枚举中的下一个值时,它才对您有效。我尝试构建calculateNext函数,但显然存在问题。我在上面的问题下提出了我的解决方案。
collatzStep n
    | even n    = n `div` 2
    | otherwise = 3 * n + 1

collatz n = iterate collatzStep n
*Main> take 10 (collatz 30)
[30,15,46,23,70,35,106,53,160,80]
list = initial : map calculateNext list