我在D http://www.digitalmars.com/d/2.0/lazy-evaluation.html
中找到了函数参数的延迟评估示例我想知道如何在D中实现可能的无限数据结构,就像它是haskell列表的常见行为一样。
是否有一些例子?
无限斐波那契序列的等价物是什么:
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
答案 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使用它,而不是结构),其中有限数量的存储和转换操作可以从任何点定义可到达的域。