PDA

View Full Version : [haskell] questo sconosciuto


pixx
28-03-2010, 15:05
ciao a tutti!
mi sto cimentando con la programmazione in haskell, senza grossi risultati a dire il vero....
sto cercando un'illuminazione principalmente: un qualcosa che mi possa aiutare a capire qual è la logica che devo adottare per programmare.
oltre a questo, sono in difficoltà nel cercare di capire come definire le matrici intese come liste di liste: io ho scritto questo codice

mat_dim::[[a]]->(Int,Int)
mat_dim xxs=(length xxs, length xxs)

che ovviamente mi restituisce 2 volte lo stesso valore, corrispondente ad una dimensione della matrice. ma come posso definire anche la seconda dimensione?
dopo ore di riflessione sono giunto al nulla....

marco.r
28-03-2010, 17:10
ciao a tutti!
mi sto cimentando con la programmazione in haskell, senza grossi risultati a dire il vero....
sto cercando un'illuminazione principalmente: un qualcosa che mi possa aiutare a capire qual è la logica che devo adottare per programmare.

In effetti haskell richiede un approccio radicalmente diverso alla programmazione, in particolare di rinunciare quasi totalmente ai side effects ed ad usare la valutazione lazy per ovviare a questo... pero' quando ci si fa la mano secondo me e' divertente.
Se hai qualche dubbio specifico prova a chiedere che magari mi riesce di esserti utile.


oltre a questo, sono in difficoltà nel cercare di capire come definire le matrici intese come liste di liste: io ho scritto questo codice

mat_dim::[[a]]->(Int,Int)
mat_dim xxs=(length xxs, length xxs)

che ovviamente mi restituisce 2 volte lo stesso valore, corrispondente ad una dimensione della matrice. ma come posso definire anche la seconda dimensione?
dopo ore di riflessione sono giunto al nulla....
se con le altre operazioni garantisci che tutte le righe hanno la stessa lunghezza, puoi ritornare la dimensione della prima riga:


matDim :: [[a]] -> (Int,Int)
matDim m = (length m,length (head m))

Per inciso il coding style di haskell prevede che si usi il camelCase per nomi di funzioni e di tipi (con iniziale minuscola le prime, maiuscola le seconde)

pixx
28-03-2010, 17:50
il problema è che non ho dubbi specifici, se non su specifici esercizi: capisco che il problema principale che ho è quello di non riuscire a staccarmi dalla normale programmazione, ma non so in che modo!
nel codice che hai scritto ad esempio, fatico a capire il ruolo della head...
io alla fine ero riuscito a scrivere

dim::[[a]]->(int,Int)
dim (xs:ys)=(length xs, 1+length ys)
che però comunque non mi risolveva il fatto di dover garantire in qualche modo che le liste abbiano la stessa lunghezza...
più vado avanti e più avrei voglia di smettere!

PS: grazie per le dritte sul coding style

shinya
28-03-2010, 20:14
Prova a seguire un libro... tipo questo...
http://book.realworldhaskell.org/read/
...che è gratuito e online. Fatti gli esercizi alla fine dei capitoli e vedrai che migliorerai.

marco.r
30-03-2010, 20:27
il problema è che non ho dubbi specifici, se non su specifici esercizi: capisco che il problema principale che ho è quello di non riuscire a staccarmi dalla normale programmazione, ma non so in che modo!
nel codice che hai scritto ad esempio, fatico a capire il ruolo della head...
io alla fine ero riuscito a scrivere

dim::[[a]]->(int,Int)
dim (xs:ys)=(length xs, 1+length ys)
che però comunque non mi risolveva il fatto di dover garantire in qualche modo che le liste abbiano la stessa lunghezza...
più vado avanti e più avrei voglia di smettere!

PS: grazie per le dritte sul coding style

Scusami, ti avevo gia' risposto, ma evidentemnte questo e' l'unico forum che la notte fa i backup distruttivi :rolleyes:

Nel tuo caso la tua soluzione e' corretta, anche se "per sbaglio"
tieni presente che stai usando una lista di liste, ovvero una lista di righe
Ad esempio la matrice

| 1 2 3 |
| 4 5 6 |
| 7 8 9 |
[code]
avra' come righe le tre liste
[code]
[1,2,3]
[4,5,6]
[7,8,9]

che combinate assieme in una lista di liste diventa

[[1,2,3],
[4,5,6],
[7,8,9]]

Ovvero una lista che contiene tre elementi, ognuno dei quali e' una lista di tre elementi

Ora il tuo codice

dim::[[a]]->(int,Int)
dim (xs:ys)=(length xs, 1+length ys)
Puo' essere scritto piu' chiaramente

dim matrix =
let
xs = head matrix
ys = tail matrix
in
(length xs, 1 + length ys)

In altri termini. Prima separi la prima riga [1,2,3] dalle altre due [[4,5,6],[7,8,9]]. Poi restituisci length xs che e' il numero di elementi di [1,2,3] che corrisponde al numero di colonne nella prima (e si spera anche nelel altre...) righe, e poi 1 + length ys che e' la lunghezza della lista con tutte le righe meno la prima, aumentata di 1 ! Corretto ma un po' contorto

cdimauro
30-03-2010, 20:30
Scusami, ti avevo gia' risposto, ma evidentemnte questo e' l'unico forum che la notte fa i backup distruttivi :rolleyes:
Non so se ci può essere una correlazione, ma sono due giorni che ci sono problemi in server farm. :stordita: