2011-06-28 16 views
12

ho trovato esempi di valutazione pigra degli argomenti delle funzioni in D http://www.digitalmars.com/d/2.0/lazy-evaluation.htmlinfinite Datastructures in D

sto chiedendo come implementare possibili infinite Datastructures in D come E'comportamento comune delle liste haskell's.

Ci sono degli esempi?

Qual è l'equivalente della sequenza di Fibonacci infinita:

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

Sarebbe qualcosa di simile http://d-programming-language.org/phobos/std_range.html#recurrence soddisfare la vostra condizione? – kennytm

risposta

10

verificare come randoms sono implementate per un esempio https://github.com/D-Programming-Language/phobos/blob/master/std/random.d

Ma ecco la sequenza di Fibonacci

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

Questa è fondamentalmente la stessa cosa della risposta di Mehrdad ma usa, in mio parere, sintassi leggermente più leggibile:

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

personalmente preferisco "ricorrenza! Q {a [n-1] + a [n-2]} (1, 1)' per le stringhe che rappresentano il codice (per mixin e functors) –

+0

** Do not ** use * any * tipo di stringa per il codice, se puoi aiutarlo (anche se tu * devi *, sono d'accordo con @ratchet). Usa invece una funzione letterale: cattura gli errori meglio. – Mehrdad

+2

È pratica comune fare esattamente ciò che eco ha fatto qui con gli archi, ed è generalmente molto più leggibile rispetto a cricchetto o alle proposte di Merhad IMHO. Tuttavia, 'recurrence' prenderà tutto ciò che è chiamabile come una funzione unaria con i tipi corretti, quindi ci sono diverse opzioni su come dare una funzione a' recurrence', e puoi scegliere quale preferisci. –

4

ratchet freak coperto Fib.

Poiché è implementato come un tipo di valore, l'esecuzione di copie di esso funzionerà come previsto. Ciò funzionerà anche per qualsiasi "struttura dati" (come l'OP lo stava usando, non una struttura) di qualsiasi dimensione in cui una quantità limitata di memoria e un'operazione di transizione possono definire il dominio raggiungibile da qualsiasi punto.

9

Arlen ha menzionato in un commento che la versione D trabocca rapidamente, perché non usa bigints. Fortunatamente, bigints sono disponibili come modulo di libreria, e sono compatibili con recurrence:

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