如何在Haskell中实现最终重复列表?

时间:2018-05-02 23:40:57

标签: list haskell wolfram-mathematica infinite

我可以看到cycle如何用于实现重复列表(例如[0,9,0,9,...],10/11的十进制扩展),但是如何实现一个具有一些初始元素的元素,然后再降格为重复模式(例如[3,1,4,2,8,5,7,1,4,2,8,5,7,...],小数扩大22/7)?我喜欢这种结构与折叠等配合良好。

我特别感兴趣的是表示小数和连续分数,其中列表分别只包含数字或数字,但是更常见类型的列表也是有意义的,例如数字对。

Mathematica实现重复分数(RealDigitsFromDigits)并重复出现连续分数(ContinuedFractionFromContinuedFraction):

ContinuedFraction[Sqrt[13]] = {3,{1,1,1,1,6}}

RealDigits[22/7] = {{3,{1,2,8,5,7}},1}

类似的问题在这里:https://mathematica.stackexchange.com/questions/21998/building-a-continued-fraction但结果似乎非常特别,我希望在Haskell中有更干净的东西。

2 个答案:

答案 0 :(得分:5)

为什么不在A

的结果前加一些东西?
cycle

“圆形”链表是尾部指向头部的链表,而这是一个链表,其中一个循环指向列表的中间,如下所示:

3 : cycle [1, 4, 2, 8, 5, 7]

答案 1 :(得分:0)

这是一个更通用的功能。它将从任何函数中获取任何实数。 当然,这只做两部分。 我相信你能做得更好。这只是一个启动者。我使用show来将数字作为字符串处理,因为Haskell对于混合浮动/非浮动类型非常挑剔。

c2l d = splitAt 1 [read [u] :: Int| u<-(tail.tail.show $ d/10)]

执行

c2l (22/7)

([3],[1,4,2,8,5,7,1,4,2,8,5,7,1,4,3])

或者

c2l (sqrt 13)

([3],[6,0,5,5,5,1,2,7,5,4,6,3,9,8,9])

Haskell数学库也是最精彩的。有计算机代数,修正点,集合论,分析,线性代数(!)和抽象代数。

取出splitAt 1只有一个线性列表。