PDA

Visualizza la versione completa : [HASKELL] Eseguire un ciclo in haskell


Neptune
16-10-2011, 18:52
Dunque sto seguendo (a lezione in università) le seguenti slide:

http://www.cs.nott.ac.uk/~gmh/book.html

Arrivato al capitolo 5, sulla comprensione delle liste, mi da il seguente esercizio:

Using a list comprehension, define a function that returns the scalar product of two lists.


Dove per prodotto scalare di due liste intende la sommatoria del prodotto membro membro delle due liste (sono so come copia-incollarvi la formula, ad ogni modo vi ho likato le slide ).

Ora io volevo scomporre il problema in:

1. Funzione che fa il prodotto membro membro;
2. Funzione che applica il prodotto membro membro a tutti i numeri delle due liste e ne restituisce la sommatoria.

Il punto uno l'ho sviluppato in questo modo:



single_product xs ys i = (xs !! i) * (ys !! i)


Ora quello che non saprei proprio come fare è il punto due, ovvero, come faccio a dire di applicare questo tante volte quanto sono lunghe le due liste (che per forza di cose devono essere lunghe uguali) e fargli fare la somma volta per volta??

A me non viene in mente nulla, qualche aiutino?

Vi ringrazio in anticipo,
Neptune.

variabile
16-10-2011, 22:56
Guarda io non conosco Haskell quindi pigliala con le pinze, ma non è che serve una funzione ricorsiva? Mi sembra che sui linguaggi funzionali si fa grande uso della ricorsione. Ciao.

toraz
17-10-2011, 10:55
La soluzione usando una list comprehension


scalar xs ys = sum [ x * y | (x, y) <- zip xs ys ]



Originariamente inviato da Neptune
Ora quello che non saprei proprio come fare è il punto due, ovvero, come faccio a dire di applicare questo tante volte quanto sono lunghe le due liste (che per forza di cose devono essere lunghe uguali) e fargli fare la somma volta per volta??

Devi utilizzare la ricorsione


scalar' xs ys = sum zs
where zs = map (uncurry (*)) $ zip xs ys

Neptune
17-10-2011, 20:51
Grazie a tutti per le risposte. Comunque si immaginavo che una spece di ciclo lo si poteva ricondurre in qualche modo ad una ricorsione, però essendo le ricorsioni nel capitolo successivo ed essendo quegli esercizi del capitolo corrente immaginavo per l'appunto che ci fosse qualche manipolazione con le liste. Con l'uso di zip effettivamente funziona tutto!

Loading