D中的无限数据结构

时间:2011-06-28 20:16:33

标签: d lazy-evaluation

我在D http://www.digitalmars.com/d/2.0/lazy-evaluation.html

中找到了函数参数的延迟评估示例

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

是否有一些例子?

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

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

5 个答案:

答案 0 :(得分:11)

recurrence!((s,n) { return s[n-1] + s[n-2]; })(0, 1)

答案 1 :(得分:10)

查看示例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;
    }

}

答案 2 :(得分:9)

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

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

答案 3 :(得分:8)

这与Mehrdad的答案基本相同,但在我看来,使用的语法稍微有些可读:

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

答案 4 :(得分:4)

ratchet freak涵盖了Fib。

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