我可以看到cycle如何用于实现重复列表(例如[0,9,0,9,...],10/11的十进制扩展),但是如何实现一个具有一些初始元素的元素,然后再降格为重复模式(例如[3,1,4,2,8,5,7,1,4,2,8,5,7,...],小数扩大22/7)?我喜欢这种结构与折叠等配合良好。
我特别感兴趣的是表示小数和连续分数,其中列表分别只包含数字或数字,但是更常见类型的列表也是有意义的,例如数字对。
Mathematica实现重复分数(RealDigits和FromDigits)并重复出现连续分数(ContinuedFraction和FromContinuedFraction):
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中有更干净的东西。
答案 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
只有一个线性列表。