【问题标题】:How to implement an eventually repeating list in Haskell?如何在 Haskell 中实现最终重复列表?
【发布时间】:2018-10-13 04:10:57
【问题描述】:

我可以看到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 中得到更干净的东西。

【问题讨论】:

  • 这与这里的(字面)主题略有不同,但您可能也对this talk 感兴趣,关于在 Haskell 中使用连分数表示(以及另一种技术)。

标签: list haskell wolfram-mathematica infinite


【解决方案1】:

为什么不在cycle 的结果前面加上一些东西?

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

虽然“循环”链表是尾部指向头部的链表,但这是一个带有指向列表中间的循环的链表,如下所示:

let x = [1, 4, 2, 8, 5, 7] ++ x in 3 : x
3 : (let x = 1 : 4 : 2 : 8 : 5 : 7 : x in x)

【讨论】:

    【解决方案2】:

    这是一个更通用的功能。它将从任何函数中获取任何实数。 当然,这只有两个部分。 我相信你可以做得更好。这只是一个开端。我使用 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 得到一个线性列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-10
      • 2017-04-16
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多