Подтвердить что ты не робот

Бесконечные Datastructures в D

Я нашел примеры ленивой оценки аргументов функции в D http://www.digitalmars.com/d/2.0/lazy-evaluation.html

Мне интересно, как реализовать возможные бесконечные Datastructures в D, как это обычное поведение списков haskell.

Есть ли примеры?

Что эквивалентно бесконечной последовательности фибоначчи:

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

Ответ 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 использовал ее, а не структуру) любого размера, где конечный объем хранилища и операция перехода могут определять доступный домен из любой точки.