Mio, che ratto di sottili distinzioni terminologiche. Cos'è questo"?
fib=0:1:zipWith (+) fib (tail fib)
Non è una funzione ricorsiva. Non sono dati ricorsivi. È una definizione ricorsiva.
Cosa viene definito?
fib
Che tipo di cosa è fib
, secondo questa definizione?
[Integer]
Un elenco di numeri interi (o forse un elenco di tutti i vecchi dati numerici).
È fib
una funzione? No, è una lista. fib
è definito in modo ricorsivo? Sì. fib
è definito in modo ricorsivo se abbiamo sostituito zipWith
con una funzione non ricorsiva dello stesso tipo (ad esempio \ f xs ys -> xs
)? Sì, anche se sarebbe un elenco definito ricorsivamente diverso.
È fib
un elenco ciclico? No. La "struttura dati ricorsiva" significa "struttura ciclica dei dati"? Non secondo il documento di Hoare, "Strutture dati ricorsive": http://portal.acm.org/book_gateway.cfm?id=63445&type=pdf&bookpath=%2F70000%2F63445%2Fcb-p217-hoare.pdf&coll=&dl=&CFID=15151515&CFTOKEN=6184618
In un'impostazione tipizzata, "struttura dati ricorsiva" significa non più o meno di "abitante di un tipo definito in modo ricorsivo". Corrispondentemente "fred"
è una struttura dati ricorsiva, anche se non è definita in modo ricorsivo, e infatti può essere gestita da funzioni ricorsive come ++
.
L'espressione "funzione ricorsiva" indica "funzione definita ricorsivamente". La frase "valore ricorsivo" significa "valore definito ricorsivamente", come esiste nei linguaggi non stretti: le lingue rigide hanno il problema della "ricorsione del valore".
E se si pensa che è pedante, provare a definire fib
in questo modo in un totale linguaggio di programmazione , e scoprirete che la nozione di "definizione ricorsiva" si divide in "Definizioni ricorsione strutturale" (che consumano dati in un modo che si ferma) e "definizione per corecursione controllata" (producendo dati in un modo che va), e che fib
è di quest'ultima varietà. In questa impostazione, la produttività di fib
dipende in modo cruciale dalla pigrizia di zipWith
. Nell'ambientazione di Haskell, ovviamente, non devi preoccuparti di nessuna di quelle cose per capire che tipo di definizione è qualcosa, solo per capire se ha una mezza possibilità di funzionare.
printf "Oh no, una funzione con argomenti zero, non possiamo averlo!" o morire; –
Un 'fib' in effetti. – Ani
'zipWith' è la funzione ricorsiva e' fib' si riferisce al suo risultato. Non c'è nulla di magico o non ricorsivo su di esso. (Le risposte sottostanti che affermano che "non ha alcuna funzione" sono confuse quanto il tuo collega.) –