Бесконечные Datastructures в D
Я нашел примеры ленивой оценки аргументов функции в D http://www.digitalmars.com/d/2.0/lazy-evaluation.html
Мне интересно, как реализовать возможные бесконечные Datastructures в D, как это обычное поведение списков haskell.
Есть ли примеры?
Что эквивалентно бесконечной последовательности фибоначчи:
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Ответы
Ответ 1
проверить, как randoms реализованы для примера 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
recurrence!((s,n) { return s[n-1] + s[n-2]; })(0, 1)
Ответ 3
Арлен упомянул в комментарии, что версия D быстро переполняется, потому что она не использует bigints. К счастью, bigints доступны в виде библиотечного модуля и совместимы с 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)
Ответ 5
храповый урод покрыл Fib.
Поскольку он реализован как тип значения, его копии будут действовать так, как ожидалось. Это также будет работать для любой "структуры данных" (поскольку OP использовал ее, а не структуру) любого размера, где конечный объем хранилища и операция перехода могут определять доступный домен из любой точки.