Quote:
Originariamente inviato da guylmaster
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.
<cut>
Il punto uno l'ho sviluppato in questo modo:
Codice:
single_product xs ys i = (xs !! i) * (ys !! i)
|
Quando hai a che fare con delle liste non metterti a prendere l'i-esimo elemento, e' altamenet inefficiente e "sbagliato" (una lista non e' un array).
Lascia quindi stare il moltiplicare lo i-esimo elemento e considera solo il moltiplicare i due elementi.
Il passo di iterare su due liste e applicare una funzione alle coppie si puo' fare in molti modi. Il piu' semplice e' probabilmente quello proposto da nico159 con zipWith
In pratica
Codice:
zipWith (*) [1,2,3,4] [5,6,7,8]
ritorna [5,12,21,32]
Nel tuo caso pero' e' chiesto di farlo con una list comprehension.
Il metodo piu' standard per farlo e' il seguente
Codice:
[ x*y | (x,y) <- zip xs ys ]
Che si legge come "crea la lista che ha come elementi il prodotto x*y, dove x e y sono le coppie che ti ottieni accoppiando le due liste xs e ys)
Il passo successivo e' quello di sommarli e lo puoi fare con la funzione sum
per cui viene fuori qualcosa tipo
Codice:
sum [ x*y | (x,y) <- zip xs ys ]
Detto questo, ci sono mille modi diversi per ottenere il risultato...