f :: Integer -> Integer -> [Integer]
f i n = n : f (i+2) (n+i)
qualcuno può spiegarmi cosa fa. so che restituisce [0,1,4,9,16 ..] ma non capisco come e cosa n : f
significaQualcuno può spiegarmi la seguente espressione di Haskell
f :: Integer -> Integer -> [Integer]
f i n = n : f (i+2) (n+i)
qualcuno può spiegarmi cosa fa. so che restituisce [0,1,4,9,16 ..] ma non capisco come e cosa n : f
significaQualcuno può spiegarmi la seguente espressione di Haskell
:
è 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.
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)
.
Hai errori di sintassi nel tuo esempio ... – sth
+1 * QUESTO * è come fare una domanda a casa. – luqui