2011-06-28 15 views
12

znalazłem przykłady leniwe oceny argumentów funkcji D http://www.digitalmars.com/d/2.0/lazy-evaluation.htmlnieskończone datastructures D

jestem zastanawiasz się, jak wdrożyć ewentualne nieskończone datastructures D jak its wspólne zachowanie list haskell's.

Czy są jakieś przykłady?

Co jest odpowiednikiem nieskończonego ciągu Fibonacciego:

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

Byłoby coś http://d-programming-language.org/phobos/std_range.html#recurrence spełniać swoją kondycję? – kennytm

Odpowiedz

10

Sprawdź, jak randoms są realizowane na przykład https://github.com/D-Programming-Language/phobos/blob/master/std/random.d

ale oto ciągu Fibonacciego

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; 
    } 

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

Jest to w zasadzie to samo, co odpowiedź Mehrdada, ale używa, w moja opinia, nieco bardziej czytelna składnia:

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

osobiście wolę 'powtarzanie! Q {a [n-1] + a [n-2]} (1, 1)' dla łańcuchów reprezentujących kod (dla mixinów i funktorów) –

+0

** Nie używaj * żadnych * rodzaj ciągu znaków dla kodu, jeśli możesz pomóc (chociaż jeśli * musisz *, zgadzam się z @ratchet). Zamiast tego użyj literału funkcyjnego - lepiej złapie błędy. – Mehrdad

+2

To niewiarygodnie powszechna praktyka, aby zrobić dokładnie to, co eco zrobiło tutaj ze strunami, a generalnie jest znacznie bardziej czytelna niż jedna z zapadek lub propozycja Merhada IMHO. Jednakże, 'recurrence' weźmie wszystko, co można wywołać jako unarną funkcję z poprawnymi typami, więc istnieje kilka opcji, w jaki sposób nadać funkcję' recurrence', i możesz wybrać którąkolwiek wolisz. –

4

ratchet freak pokryte Fib.

Ponieważ jest zaimplementowany jako typ wartości, wykonanie jego kopii będzie zgodne z oczekiwaniami. Będzie to również działać dla dowolnej "struktury danych" (ponieważ OP używał jej, a nie struktury) dowolnej wielkości, w której skończona ilość pamięci i operacja przejścia mogą definiować osiągalną domenę z dowolnego punktu.

9

Arlen wspomniał w komentarzu, że wersja D szybko się przepełnia, ponieważ nie używa bigii. Na szczęście bigints są dostępne jako moduł biblioteki i są kompatybilne z recurrence:

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