|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Aug 2002
Messaggi: 2518
|
[Haskell] Eseguire un ciclo in haskell
Dunque sto seguendo (a lezione in università) le seguenti slide:
ttp://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: Codice:
single_product xs ys i = (xs !! i) * (ys !! i) A me non viene in mente nulla, qualche aiutino? ![]() Vi ringrazio in anticipo, guylmaster Ultima modifica di guylmaster : 16-10-2011 alle 18:07. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Aug 2003
Città: Barletta (BA)
Messaggi: 939
|
Codice:
sum ( zipWith (*) xs ys ) ![]()
__________________
In a world without fences, who needs Gates? Power by: Fedora 8 - Mac OS X 10.4.11 Ultima modifica di nico159 : 16-10-2011 alle 19:16. |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Codice:
scalar_product xs ys = sum $ [ x*y | x <- xs, y <- ys ]
__________________
GPU Compiler Engineer Ultima modifica di AnonimoVeneziano : 16-10-2011 alle 20:23. |
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Aug 2003
Città: Barletta (BA)
Messaggi: 939
|
Quote:
[1, 2, 3] e [1, 2, 3] Il risultato di [ x*y | x <- xs, y <- ys ] dovrebbe essere: [1, 2, 3, 2, 4, 6, 3, 6, 9] Invece il risultato corretto dovrebbe essere: [1, 4, 9]
__________________
In a world without fences, who needs Gates? Power by: Fedora 8 - Mac OS X 10.4.11 |
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
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] 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 ] 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 ]
__________________
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. |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Argh, sto diventando lento a postare XD.
Codice:
scalar_product xs ys = sum $ [ x*y | x <- xs, y <- ys ] (e togliere un $ di troppo) Codice:
scalar_product xs ys = sum [ x*y | x <- xs | y <- ys ]
__________________
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 |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
![]()
__________________
GPU Compiler Engineer |
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Aug 2002
Messaggi: 2518
|
Quote:
Codice:
scalar_product :: [Int] -> [Int] -> Int scalar_product xs ys = sum [ x*y | x <- xs, y <- ys ] Codice:
Main> scalar_product [1,2,3] [4,5,6] 90 |
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Aug 2002
Messaggi: 2518
|
Se invece uso la versione con zip:
Codice:
scalar_product2 xs ys = sum [ x*y | (x,y) <- zip xs ys ] |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
edit: non mi ero accorto del post piu' sopra, ora sistemo la risposta
Codice:
[ x*y | x<- xs, y <- ys ] Se xs = [1,2,3] e yz = [4,5,6], il risultato e' [ 1*4, 1*5, 1*6, 2*4, 2*5, 2*6, 3*4, 3*5, 3*6 ] Mentre la seguente Codice:
[ x*y | (x,y) <- zip xs ys ] che una volta sommati danno il risultato previsto.
__________________
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 22:15. |
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Aug 2002
Messaggi: 2518
|
Quote:
Devo ammettere però che sto incrociando non poche difficoltà... ma è normale impazzirci su questo metodo di programmazione o basta trovare qualche guida fatta meglio?! Perchè non riesco ad immergermi al meglio nella logica di programmazione, cioè mai mi sarebbe venuto in mente l'idea di scrivere [x*y|..], credevo che potessi scrivere, trattandosi di una lista, semplicemente "l'insieme delle x dato che rispecchia le proprietà dopo il segno |". Come anche questa cosa del prodotto cartesiano, praticamente non ragiona nel nostro modo nel senso di mettere "prima una x e poi una y" ma lo vede come "ogni x assieme ad ogni y". Probabilmente se incorressi in qualche esempio in più di questi esercizietti svolti con le liste a mo di insiemi ci prendere meglio la mano! |
|
![]() |
![]() |
![]() |
#12 | ||||
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
![]() ![]() Non scherzo ![]() Quote:
La notazione rispecchia un po' la notazione matematica di insieme, anche se usa le [] invece che le {}. In termini matematici il prodotto cartesiano lo avresti scritto come { xy | x <- xs, y <- ys } Praticamente identico (a parte l'usuale ellissi della moltiplicazione). Quote:
Quote:
Purtroppo non ho molta dimestichezza con i libri di testo o siti di esercizi su haskell, ce ne sono diversi ma non quando imparavo io, per cui... ![]()
__________________
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 |
||||
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Aug 2002
Messaggi: 2518
|
Quote:
A fine slide ci sono quei 2-3 esercizi proposti, ma come vedi non c'è la soluzione. E poi secondo me 2-3 non sono abbastanza, bisognerebbe farne parecchi per prendere dimestichezza. |
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Il che è normale, dato che non è il solito linguaggio a paradigma imperativo/procedurale, e richiede all'utente di pensare in modo differente. Magari dipende dal testo, dal modo in cui tratta gli argomenti, non so. Se vuoi un complemento da affiancare per lo studio (anche solo per avere sotto mano esempi diversi d'uso dei vari costrutti) e non hai problemi con l'inglese ti consiglio questo (io mi ci sto trovando parecchio bene): http://learnyouahaskell.com/chapters Prova a "farti" i primi te capitoli (compreso quello che introduce il type system), penso che ti aiuterà a fare chiarezza ![]()
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 17-10-2011 alle 08:16. |
|
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
![]() Io lo trovo comodo soprattutto per elaborazioni batch (traduttori/generatori di codice etc.) Per quel che riguarda hugs... ormai tutti usano ghc, a parte chi insegna :P
__________________
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 |
|
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Già Haskell è un linguaggio da hipster... poi usare hugs! Della serie "GHC is too mainstream".
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
![]() |
![]() |
![]() |
#17 | ||
Senior Member
Iscritto dal: Aug 2002
Messaggi: 2518
|
Quote:
Umm lo avevo già tra i preferiti quella guida, già che me l'hai consigliata spulcerò per bene anche quella. Comunque avevo già svolto due esercizi prima di questo con le liste, solo che non avevo visto nessun esempio in cui mettevi un operatore anche a sinistra (x*y) e semplicemente non mi era venuto in mente. Lo zip di venirmi mi era venuto, ma senza quel prodotto affianco non sapevo come sfruttarlo. Diciamo che facendo qualche altro esercizio e vedendo qualche altro esercizio già svolto magari prendo più dimestichezza. Perchè almeno la mia mente funziona per "già visto" e poi compone le varie cose già viste. Raramente mi viene da dire "ma forse posso fare anche questo" ![]() Quote:
Eh questo l'avevo immaginato ma inanzi tutto all'esame dovro utilizzare hugs quindi prenderci quel minimo di dimestichezza che serve non è una brutta cosa, inoltre per ghc ho il seguente problema su macos: - Richiede Xcode, ma Xcode 4, che è pure gratuito è solo Lion, io che ho snow leopard come faccio? Ho pure provato (anche se non con molta insistenza) a cercare qualche versione vecchia di xcode3 ma nulla. Daltronde ho pure paura ad aggiornare a Lion perchè almeno all'inizi mi parlavano di qualche incompatibilità con del vecchio software, e vorrei evitare rotture di scatole. |
||
![]() |
![]() |
![]() |
#18 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Nel tutorial al link, quando si arriva alle list comprehension, hanno già spiegato due punti: 1) le funzioni in Haskell esistono nella forma prefissa e infissa. Quando definisci una funzione, di default, è prefissa, a meno che il nome della funzione non sia composto solamente di simboli, nel qual caso è infissa. Per usare una fuzione prefissa come se fosse infissa devi racchiuderne il nome tra i caratteri di backtick '`'. E' il caso della funzione elem, o div: Codice:
{- elem (prefissa) -} elem 'o' "Hello!" {- elem, in forma infissa -} 'o' `elem` "Hello!" {- div (prefissa) -} div 10 2 {- div, in forma infissa -} 10 `div` 2 Codice:
{- * (infissa) -} 3 * 2 {- *, in forma prefissa -} (*) 3 2 Codice:
[output function | input set, predicate] Sapendo che cos'è la parte prima del pipe (output function) non avresti avuto difficoltà a pensare a quell'x*y. ![]() Questo intendevo con il "capire i concetti". Senza di questi, e basandoti solo su esempi di codice, rischi di far confusione. Comunque buono studio ![]()
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 17-10-2011 alle 14:09. |
|
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
@guylmaster:
Ciao, se ti interessa, ti segnalo questa pagina, ci sono degli esercizi in Haskell "for beginners" (e le soluzioni): http://blog.tmorris.net/haskell-exer...for-beginners/ E qua altri 99 problemi (e soluzioni): http://www.haskell.org/haskellwiki/99_Haskell_exercises
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:45.