PDA

Visualizza la versione completa : [Haskell] Creare lista di interi ricorsivamente


Ippo343
26-06-2010, 03:23
Ciao a tutti...

Ho scritto una funzione in Haskell che crea una lista di interi, così:



listDown 0 = [0]
listDown x = x : listDown (x-1)


Se l'argomento è 0, ritorna la lista che contiene solo 0, se l'argomento è diverso da 0, aggiunge l'argomento alla lista dei numeri prima di lui... in pratica



listDown 3 == 3: (2: (1: ([0]))) == 3:2:1:[0]


E fin qui tutto bene... però non riesco a scrivere una funzione che faccia l'opposto, ovvero che crei la lista in ordine crescente!

Questo perchè i 2 punti (l'operatore cons) permettono di aggiungere un oggetto solo in testa alla lista...



1:[2,3,4] == [1,2,3,4]
[4,3,2]:1 --> errore
[4,3]:[2,1] --> errore


e quindi non so come scriverlo... ovviamente un modo ci deve essere, ma non riesco a capire come scriverlo in modo ricorsivo... qualche idea? :confused:

Ippo343
26-06-2010, 03:33
Update: ok, problema "risolto". Ho trovato una soluzione che però mi sembra molto molto "sporca":



list_up s e
| s < e = s : (list_up (s+1) e)
| s == e = [e]
| s > e = []

listUp x = list_up 0 x


Funziona, però non so, sento che ci deve essere un modo più elegante di farlo... Cioè, Haskell è fatto apposta per queste cose...

toraz
26-06-2010, 20:22
La soluzione più rapida è questa


listUp x = [0..x]


Oppure puoi semplificare un po' quella che hai scritto



listUp x = listUp' 0 x

listUp' start end
| start <= end = start : listUp' (start + 1) end
| otherwise = []


mi pare abbastanza ragionevole come soluzione, di certo non molto molto sporca, ma tieni presente che non sono certamente un guru di Haskell. :)

Ippo343
26-06-2010, 21:55
Originariamente inviato da toraz
La soluzione più rapida è questa


listUp x = [0..x]



... ._.

Non pensavo che una sola riga di codice potesse farmi sentire così stupido xD

Loading