View Single Post
Old 16-10-2011, 20:38   #5
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da guylmaster Guarda i messaggi
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...
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele

Ultima modifica di marco.r : 16-10-2011 alle 20:42.
marco.r è offline   Rispondi citando il messaggio o parte di esso