【问题标题】:infinite Datastructures in DD中的无限数据结构
【发布时间】:2011-06-28 20:16:33
【问题描述】:

我在 D http://www.digitalmars.com/d/2.0/lazy-evaluation.html 中找到了对函数参数进行惰性求值的示例

我想知道如何在 D 中实现可能的无限数据结构,就像 haskell 列表的常见行为一样。

有例子吗?

无限斐波那契数列的等价物是什么:

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

【问题讨论】:

标签: d lazy-evaluation


【解决方案1】:
recurrence!((s,n) { return s[n-1] + s[n-2]; })(0, 1)

【讨论】:

    【解决方案2】:

    https://github.com/D-Programming-Language/phobos/blob/master/std/random.d为例查看随机数是如何实现的

    这里是斐波那契数列

    struct FiboRange{
        enum bool empty=false;//infinite range
    
        long prev=0,curr=1;//the state for next calculations
    
        @property long front(){
            return curr;//current value
        }
    
        void popFront(){//calculate the next value
            long tmp = curr;
            curr += prev;
            prev = tmp;
        }
    
    }
    

    【讨论】:

      【解决方案3】:

      Arlen 在评论中提到 D 版本很快溢出,因为它不使用 bigint。幸运的是,bigint 可以作为库模块使用,并且与 recurrence 兼容:

      import std.bigint;
      auto fibs = recurrence!"a[n-1] + a[n-2]"(BigInt(1), BigInt(1));
      

      【讨论】:

        【解决方案4】:

        这与 Mehrdad 的回答基本相同,但在我看来,它使用了更易读的语法:

        recurrence!"a[n-1] + a[n-2]"(1, 1)
        

        【讨论】:

        • 我个人更喜欢 recurrence!q{a[n-1] + a[n-2]}(1, 1) 用于表示代码的字符串(用于混合和仿函数)
        • 不要在代码中使用 any 类型的字符串,如果你能提供帮助的话(尽管如果你必须 ,我同意@ratchet)。改用函数字面量——它会更好地捕捉错误。
        • 使用字符串完全按照 eco 在这里所做的操作是非常普遍的做法,而且它通常比棘轮或 Merhad 的建议更易读,恕我直言。但是,recurrence 会将任何可调用的东西作为具有正确类型的一元函数,因此有几个选项可以将函数赋予 recurrence,您可以选择您喜欢的任何一个。
        • 如果 D 允许您将表达式(一种宏,而不是评估表达式的值)作为参数传递给模板,那就太好了。
        • 遗憾的是,D 版本很快溢出,但 Haskell 版本继续打印斐波那契数,因为它使用 Big int。
        【解决方案5】:

        ratchet freak 覆盖了 Fib。

        因为它是作为值类型实现的,所以复制它会按预期进行。这也适用于任何大小的任何“数据结构”(因为 OP 正在使用它,而不是结构),其中有限的存储量和转换操作可以从任何点定义可达域。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-06-17
          • 1970-01-01
          • 2012-09-20
          • 1970-01-01
          • 1970-01-01
          • 2010-11-10
          • 2012-07-23
          • 2018-03-30
          相关资源
          最近更新 更多