бесконечные структуры данных в D - PullRequest
12 голосов
/ 29 июня 2011

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

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

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

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

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

Ответы [ 5 ]

11 голосов
/ 29 июня 2011
recurrence!((s,n) { return s[n-1] + s[n-2]; })(0, 1)
10 голосов
/ 29 июня 2011

посмотрите, как реализованы случайные значения для примера 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;
    }

}
9 голосов
/ 11 июля 2011

Арлен упомянул в комментарии, что версия D быстро переполняется, потому что она не использует bigints. К счастью, bigints доступны в виде библиотечного модуля и совместимы с recurrence:

import std.bigint;
auto fibs = recurrence!"a[n-1] + a[n-2]"(BigInt(1), BigInt(1));
8 голосов
/ 29 июня 2011

Это в основном то же самое, что и ответ Мерадада, но использует, на мой взгляд, немного более читаемый синтаксис:

recurrence!"a[n-1] + a[n-2]"(1, 1)
4 голосов
/ 29 июня 2011

чокнутый урод покрытый фиб.

Поскольку он реализован как тип значения, его копии будут работать, как и ожидалось. Это также будет работать для любой «структуры данных» (как ее использовал OP, а не для структуры) любого размера, где конечный объем памяти и операция перехода могут определить достижимую область из любой точки.

...