Haskell 如何使用rational元素创建列表
我尝试以下方法。函数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 编辑: 你好,谢谢你的回答。科拉茨的例子对我帮助很大。但对于解决方案,我使用了另一种想法。现在,我写下以下内容: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)…]教学,这
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