2011-01-04 3 views

risposta

10

: è l'operatore "contro" e costruisce un nuovo elenco la cui testa è il valore a sinistra dell'operatore e la cui coda è il valore a destra dell'operatore. Pertanto, 0 : [1, 2, 3] è l'elenco [0, 1, 2, 3].

Controllare il comportamento di questa funzione, valutando f 1 0 come segue:

f 1 0 = 0 : f 3 1 

cioè f 1 0 è il risultato di creare una nuova lista contenente 0 in testa e la lista restituita da f 3 1 come la coda. Analogamente, f 3 1 è come segue:

f 3 1 = 1 : f 5 4 

cioè f 3 1 è il risultato di creare una nuova lista contenente 1 in testa e la lista restituita da f 5 4 come la coda.

Così, la funzione ricorsivamente crea un elenco. Inoltre, è infinitamente coda-ricorsivo (poiché non ha una condizione di terminazione) e quindi si tradurrà in una lista infinitamente lunga.

quanto riguarda la linea iniziale, f :: Integer -> Integer -> [Integer], questo indica che f è una funzione che prende due interi (Integer -> Integer) e restituisce una lista di numeri interi ([Integer]). A rigor di termini, f prende un numero intero (Integer) e restituisce un'altra funzione che prende un numero intero e restituisce un elenco di numeri interi (Integer -> [Integer]) come risultato della funzione di elaborazione. Questo è un concetto con cui vi familiarizzerete quando entrate in Haskell e in altri linguaggi di programmazione funzionale in modo più approfondito.

5

Il codice nella tua domanda non fa nulla perché contiene un errore di tipo e un errore di sintassi.

f :: Integer -> Integer --> [Integer] 

Come si può vedere dalla evidenziando l'ultimo pezzo è un commento, perché -- inizia un commento in Haskell. Di conseguenza, il tipo dichiarato di f è Integer -> Integer, che è errato. Per risolvere questo cambiamento --> a ->.

f i n = n : f (i+2) (n+i] 

Qui si ha un'apertura ( e quindi una chiusura ]. Ovviamente è sbagliato. Per risolvere questo cambiamento (n+i] a (n+i).

Ora che quel che è fatto, ecco cosa il codice fisso fa:

: è un costruttore per il tipo di lista. x : xs è la lista che ha come capo e xs come coda. n : f (i+2) (n+i) viene analizzato come n : (f (i+2) (n+i)) (non (n : f) (i+2) (n+1) come sembra credere). Quindi crea una lista la cui testa è n e la sua coda è il risultato di f (i+2) (n+1).