Gitbaritalian
developer
podcast
29

Marco Shuttle, programmazione funzionale php e sviluppo software

Serie 1
Episodio 29
Durata 70 minuti

La programmazione funzionale, buzzword degli ultimi tempi che però affonda radici profonde nella storia del mondo degli sviluppatori, basti pensare che il lambda calcolo risale agli anni 30. Ne abbiamo parlato con Marco Shuttle, che grazie alla sua prospettiva ibrida di matematico e di sviluppatore ci ha reso meno spaventosa un paradigma di programmazione che è visto come una montagna da scalare per chi ci approccia per la prima volta

Links

Contatti

@brainrepo su twitter o via mail a info@gitbar.it

Crediti

Le sigle sono state prodotte da MondoComputazionale Le musiche da Blan Kytt - RSPN e Broke For Free - Something Elated

Trascrizione

Trascrizione automatica realizzata con servizi Amazon AWS Transcribe

benvenuti su bar di podcast dedicato al mondo dei full stack developer di mezzo artigiani mezzo artisti che ogni giorno infilavano le mani nel fango per creare nel modo più efficiente possibile quei prodotti digitali che quotidianamente usiamo.
Bene.
Benvenuti in questo nuovo appuntamento di bar in versione estiva.
Questa versione estiva in realtà un periodo un po' particolare non mi sento solo, anche se sono tornato in Sardegna e ho lasciato le riunioni lionesi finalmente nelle in buona parte delle puntate che sto registrando qua sono accompagnato da ospiti una serie di ospiti super preparati come quello di oggi abbiamo con noi Marco, qualcuno lo conoscera' su cio' Gianmarco qualcuno ti conoscera' su Twitter come Marco Chang è uno sviluppatore asso, una società che si occupa di gestire i sistemi di pagamento a rate.
Un catering categorica pensate è talmente difficile per me anche da dire conosce i linguaggi come Haskell, che per me è abbastanza esoterico.
Ho provato a guardarlo, ma mi sono spaventato ed è un amante del cioccolato.
Ciao Marco, benvenuto a Mauro, Grazie Allacciato te ti faccio subito.
La domanda che faccio a tutti è come è iniziata a sviluppare come sei entrato in questo tunnel senza via d'uscita.
Allora io ho iniziato relativamente molto tardi a programmare perche' ha per lunghi anni non è non è assolutamente è stato il mio desiderio quello di diventare un programmatore.
Io sono rimasto o all'università a fino a un bel po' eh? Fino circa ventotto anni io sono rimasto all'università a tra laurea, dottorato e e una piccola borsa di studio dopo il dottorato e fino a che mi sono reso conto che non era una vita che faceva per me quella di restare nel mondo accademico e ho deciso di tornare a tornare in italia.
Ero in polonia al tempo è per avere qualcosa di un po', di un po' più stabile è quindi sono tornato in italia e mi sono guardato un po' in giro su che lavoro potevo fare con una laurea in matematica e conoscenze non particolarmente applicabili alla contro l'atto un mondo del lavoro e diciamo i due ambiti dove mi sono messo a cercare era stato in ambito bancario e in ambito di appunto come come programmatore e dall' ambito bancario.
Non ho mai ricevuto nessuna risposta e mentre l'ambito programmazione e' bastato mandare in giro, rispondere a qualche annuncio online per ricevere risposte, essere praticamente assunto dall'oggi al domani.
Quindi, diciamo sarà molta più richiesta in ambito programmazione che in ambito bancario.
E così ha iniziato quindi un po' per caso avevo fatto un po' di corsi di programmazione all'università, ma soprattutto software legati alla matematica.
La simulazione modellazione quindi non programmazione oggetti, non programmazione funzionale.
Cosa tipo matlab esatto.
Matlab matematica avevo usato è quindi si'.
Avevo le mie idee di programmazione, sapevo scrivere qualche scrip tino qualcosina, ma non avevo mai fatto niente di serio.
È quindi mi sono trovato a praticamente ha ventotto anni e iniziare a imparare a programmare seriamente all'inizio ho iniziato a lavorare in un'azienda che sviluppava gestionali Microsoft e quindi mi sono trovato a sviluppare questo gestionale enorme perché ovviamente la soluzione ma mai portare ah, pensata per qualunque cosa e mi sono trovato in mano questo pesa enorme.
Ho dovuto iniziare a imparare a gestirlo.
Non può mettere le mani qui e lì per per farci fare un po', quello quello che serviva e dalla più o meno dopo iniziato ho iniziato a capire un po' di cose ha iniziato a dire a mi piace più questo mi piace più quello a muovermi.
E dopo pian piano diciamo mi sono direzionato verso le cose che mi divertivano di piu'.
Eccoci qua ed era là che volevo ballare.
In realtà è già messo le basi per questa domanda.
In parte hai anche già risposto, secondo me, naturalmente, ma ho visto che comunque nelle tue presentazioni ritorna pesantemente la parte della programmazione funzionale con Haskell e e via dicendo e da amici in comune e so che hai approfondito pesantemente l'argomento.
Quindi la mia domanda è perché hai approfondito la programmazione funzionale? Ti ha spinto verso quel mondo oltre naturale allora accademica? Allora anche qua direi che la risposta e' il principale viene mente principalmente per caso.
È perché, ovviamente, quando ha iniziato a programmare, anche negli anni successivi il primi anni in cui programmavano, non avevo idea di cosa fosse la programmazione funzionale, non sapevo che esistesse cosa fosse, di cosa trattasse e quindi diciamo andando avanti con il lavoro iniziato, come molti di noi, a diventare un programmatore.
Oggetti, quindi iniziare a studiare paterna e framework a oggetti e in e tutti i concetti di questo tipo.
Ad un certo punto mi sono trovato a essere curioso di che cosa era reale programming.
È qui che non è qualcosa di strettamente collegato o necessariamente collegato alla programmazione funzionale e mi è capitato un certo punto sotto ma no, un linguaggio che si chiama helm, a cui mi sono interessato perché al tempo si pubblicizzava come un linguaggio per fare la cattiva fasciano programming mai, ovviamente al tempo era interessato alla parte che non necessariamente alla parte fan ciano è quindi ho iniziato a imparare un po' helm ha letto il tutorial, ha fatto qualche piccola giusto per per giocarci un po' a imparare usarlo mia mi è piaciuto molto e la hanno iniziato a scoprire tutto di questi piccoli concetti di programmazione funzionale che ho iniziato a ricollegare a tutto quello che avevo fatto all'università e ha iniziato a dirmi ah, ma nella programmazione serve un po' allora quello che ho studiato di molto teorico all'università ci sono cose che si collegano molto bene e quindi da lì in poi ha iniziato un po' a tralasciare l'aspetto di programmazione che deve e avvicinarmi invece è molto di più a quella che era la programmazione funzionale in serra e quindi sono passato principalmente prima da thelma e poi mi sono spostato principalmente verso verso Haskell che un po' di un linguaggio che un po' più evoluto all'interno del paradigma funzionale fortemente stipato.
Hai parlato directive programming e programmazione funzionale qualche secondo fa e hai detto che sono comunque dei concetti comunque diversi.
Dove sta la differenza? Attrarre active programming e paradigma funzionale e cos'è la reattive che cos'è la funzionale giusto per mettere un pochino in ordine le idee.
Muoverci con delle basi, certo.
Allora va innanzitutto secondo me sono due concetti diversi, perché principalmente si può fare una senza fare l'altro e dove la programmazione riattiva qualcosa.
Dove e la l'oggetto principale oggetto non inteso strettamente come programmazione oggetti, ma nel senso la cosa su cui si lavora principalmente è una stringa dove uno stream di dati a qualcosa che si aggiorna nel tempo è praticamente un un day that types che si aggiorna nel tempo, quindi non lo so.
Un tipico esempio può essere gli eventi in un browser quando si lavora a con javascript che esista in ascolto agli eventi.
Quindi se si, se si guarda lo string degli eventi, qualcosa che muta nel tempo e programmazione funzionale puo' a trattare appunto la una stringa di dati, ma può anche dire okay, tratto come oggetti, tu tltro il focus principale, per come la vedo io della programmazione funzionale da un lato a descrivere le cose con le funzioni che diventano oggetti di primo, diciamo nel linguaggio, ma soprattutto tutto.
E io guardo la, soprattutto la programmazione funzionale fortemente stipata la capacità di descrivere con tipi di dato a in maniera molto precisa quello su cui si sta lavorando.
Grazie per averci un po' schiarito le idee.
Mi collego con una cosa che guardavo qualche tempo fa.
La settimana scorsa abbiamo avuto come ospite qua bar.
Massimiliano è probabilmente lo conosci, di norma è e con lui abbiamo provato a dare un'occhiata al mondo del domani in una cosa molto carina che ho avuto modo di vedere questo ultimo periodo.
Sono alcuni titoli che provano a raccontare, a portare il contesto del sulla programmazione funzionale ed è una cosa che mi ha affascinato, perché in realtà c' è un utilizzo dei tipi che è si presta molto bene a quel tipo di paradigma, è come vede appunto l'ingresso dei concetti di sul mondo della funzionale.
Ah, io lo vedo assolutamente come una coppia se non perfetta, che si avvicina molto alla perfezione.
Le due cose che mi piace molto approfondire nel campo della programmazione sono proprio programmazione funzionale.
E domenica Zayn e credo che si sposino veramente bene, secondo me un pochino un peccato che ha domande vivendo nata e cresciuta in un mondo fortemente a Donzelli.
E quindi i libri, i famosi che si trovano in giro a raccontino i pattern da un punto di vista prettamente della programmazione oggetti.
Però già se si guarda si legge il libro di Evans, mentre già si trovano molte idee che vengono dalla programmazione funzionale.
Per esempio mi viene in mente quando parla di dice esplicitamente che è molto meglio che siano immutabili, eh e tante altre piccole cose di questo tipo.
Anche semplicemente ragionare ad eventi è semplicemente un modo per rendere lo stato di un'applicazione o un oggetto immutabile.
È un modo per verificare il cambiamento di stato, quindi anche quello puo' essere facilmente visto come un'idea che viene dalla programmazione funzionale.
Poi magari l'idea non è ultimamente nata da lì, ma si sposa molto bene con un approccio di programmazione funzionale, cioè krug yang a che è praticamente di ha comunque lui risposta per il goulash è che dice che il è praticamente un un fold degli eventi partendo dallo stato vuoto.
In realtà è effettivamente quello dove fonda.
Pensiamo a un tizio che accumula uno stato, quindi anche quello in fondo è un concetto tipico di programmazione funzionale.
Quindi effettivamente tra domanda in programmazione funzionale ci sono molti punti, se non in comune molti punti che si sposano bene tra loro.
E ultimamente stavo leggendo anch'io un libro se non ricordo male di Scott, lo lasci, lascio inesatte, si chiama facciamo domani modeling o qualcosa di molto simile, se è questo che di scorrere lascia che non riesco neanche a pronunciarlo.
Pensate a non sono sicuro che la pronuncia sia quella.
Io ho provato come mi veniva si' il gol che lui lavora in sharp.
No, è la benvenuta.
Lasciasse l'importanza dei tipi il sistema di tipi come concetto di contratto con il business.
Veramente, veramente affascinante.
Si' sia assolutamente molto bello.
Anche perché da presa l'essenza diciamo di quello che racconta è una cosa che mi interessa molto ultimamente.
Come è sia possibile modellare un dominio dove è assolutamente solo con i tipi? Ma se vai proprio alla all'essenza quello che ti serve per modellare un dominio sono funzioni.
Ah, hai prodotto? E insomma, dove ha per essere un po' piu' esplicito.
I tipi prodotto sono praticamente dei record, quindi ti permettono di mettere di da diciamo al concetto di congiunzione.
Quindi abbiamo non so, un record che contiene due cose diverse e i tipi somma sono invece quelli che ti permettono di integrare il concetto di disgiunzione.
Quindi ho e quindi dire una cosa può essere o questo o quello per fare.
Per fare un esempio concreto è in cella un tipo somma non può essere Non so vuoi avere hai un colore che può essere giallo, rosso, verde è quindi hai dei valori che sono giallo, rosso e verde.
E' il tuo tipo che è il tipo di colore, non sai.
Quindi per modellare questa cosa tu dici quello che dici proprio a parole.
Il mio colore tipo può essere giallo oppure rosso oppure verde.
Forse ne abbiamo sentito parlare di questi concetti.
Magari quando abbiamo sentito parlare di types.
Si dimentichi questo.
Esatto.
Gli sono molto, molto simili rispetto ai santi.
Sono leggermente diverse, ma non so se ha senso adesso mettersi a fare il pelo nell'uovo Direi proprio di no.
Anche perché non ho abbastanza competenze per poterlo fare, quindi potremmo rimanere ad ascoltarti.
È così a bocca aperta.
Ma non potremmo contribuire alla la discrezione e' proprio per ovvi limiti è comunque un mondo senza dubbio affascinante.
Un mondo anche che, come stavamo vedendo adesso, all'inizio spaventa un pochino, no? Quando sentiamo parlare di fan Toro Mona, di questi nomi quasi esoterici non può che che allontanano.
In realtà sono dei concetti alla base proprio di di tantissimi elementi, anche di tipo matematico e della teoria degli insiemi.
Ci puoi aiutare a capire cosa sono i fan? Torre le monadi si' Posso provare dopo? Immagino questa la solita domanda trabocchetto è un modo di dire nella programmazione funzionale che dice se se sai cos'è una monade allora è disperso l'abilita' piegarlo.
E quindi adesso non so se io so effettivamente che cos'è una monade pero'.
Supponendo che io lo sappia e spero che tu sei immagino che tu speri che io lo sappia.
Vuol dire che non saro' capace di spiegarlo.
Però va bene.
Ah, ci ci proviamo e vediamo cosa ne viene fuori, eh, Allora beh, innanzitutto ci tengo a dire che effettivamente ha i termini.
Ha proprio fumatore e monade.
Sono cose che vengono strettamente dalla matematica.
Quindi la terminologia che arriva in questo caso alla programmazione funzionale è qualcosa che non è stata scelta dai dai programmatori che hanno scoperto ho incontrato questi concetti, ma semplicemente erano cose che esistevano gia' a in matematica e qualcuno si è reso conto che potevano tornare utili in programmazione e ha importato questi concetti portandosi dietro in qualche modo tutto il bagaglio di nomenclatura e di in qualche modo complicazione che la matematica porta dietro.
È perché anche se volessimo definire così in breve a questo è un altro tipico gioco di programmazione funzionale dire che una monade è unendo no dire che una monade nella categoria degli hand off untore non vuol dire assolutamente niente per chi non ha studiato e tante altre cose di teoria delle categorie è quindi direi che a cercare di spiegare queste cose a chi non non le sa gia' praticamente una strada abbastanza ah salita pendenza al duecento volte piu' volte in salita, molto in salita volevo dire senza uscita farebbe al hai un po' di speranza, intesa per comunque per cercare di dare un'idea di cosa sono i fumatori e le monadi.
Allora innanzitutto le monadi sono anche dei fumatori.
Quindi se vogliamo arrivare a spiegare che cosa sono le monadi, dobbiamo prima a partire dal dire che cosa sono i fumatori.
Allora un fumatore permane la spiegazione piu' semplice.
Sono semplicemente un contesto all'interno del cui si lavora e dopo cosa intendo con questo A se lavoriamo molto con i tipi e vogliamo rappresentare una funzione, una funzione diciamo che ha tipo che prende un input di tipo A e mi restituisce un output di tipo B.
Ok, quindi scrivono dico che il suo tipo è una funzione da habibi e' per quello che interessa a me interessa informatore funzionali, una funzione che a questo tipo non può fare altro.
Cioè dato un input, può solo ed esclusivamente a ritornare a un occhio.
Non puo' scrivere in Consob non può fare chiamate http non può interagire con un database, non può fare niente.
Lo sei, quindi Esatto.
Zero sai è però noi vogliamo fare anche a Dobbiamo scrivere applicazioni che abbiano un minimo di utilità di utilita' concreta e' e quindi per fare questo è un trucco che si usa quello diciamo di andare a dire nel nostro tipo di ritorno, quindi invii a dire Guarda che io non ci ritorno solamente un bimbo ritorno un B in un particolare contesto, a esempio di ritorno un B nel contesto medi oppure option.
E questo cosa vuol dire? Cosa? Un mayday a qualcosa che ti dice un valore oppure no.
Quindi a ti rappresenta la possibile assenza di un valore.
Quindi sai, un valore di tipo medico di vuol dire che potresti avere un valore di tipo B, oppure potresti non averlo.
Però questa cosa, la possibile assenza del valore ce l'hai rappresentata dal tipo Non che Ok, quindi se adesso prendiamo una funzione, dà a me i BB.
Stiamo dicendo che abbiamo una funzione che prende un input di tipo A e ci ritorna.
Ho un B o niente.
Una sorta di scatto letta quindi che contiene il nostro valore all'anno.
Esatto.
Noi la trattiamo come scatto letta.
Però in realtà quello che ci sta dentro potrebbe essere il valore o niente.
Esatto.
E quindi questa scatoletta grazie per il termine di cui di cui parli tu è il contesto A in cui chiudiamo il nostro.
Il nostro tipo B in questo caso nell'esempio di me.
B Il contesto è un contesto dove Ah, stiamo modellando la possibile assenza di valori.
Lo che in questo caso, quando guardiamo le funzioni, quello che stiamo modellando è il fatto che la funzione possa fallire.
Quindi, se abbiamo una funzione da A a B, quella sicuramente ci ritornera' un una tuta di tipo B.
Se abbiamo qualcosa che vada a May B B, allora stiamo dicendo forse otteniamo B.
Forse invece la funzione fallisce.
Quindi andiamo a lavorare nel contesto in cui le nostre operazioni possono fallire.
Certo.
E a questo punto questo è un particolare contesto a ogni fumatore è un specifico contesto e quindi potremmo avere altri tipi di contesto.
Quindi non so il contesto dove le nostre operazioni possono fallire con un particolare errore.
È oppure un contesto in cui le nostre operazioni dipendono da uno Stato e vanno ad aggiornare uno stato della nostra applicazione.
Quindi in un altro contesto in cui ah, possiamo leggere dei valori dalla configurazione oppure un altro contesto in cui possiamo interagire col mondo esterno.
Anche qui non si usano solo nel caso del fallimento, ma in opzione, dove dobbiamo mitigare gli effetti collaterali.
Esatto.
Quindi diciamo quello che in programmazione procedurale in programmazione a oggetti side effects che vengono inseriti normalmente all'interno del codice in programmazione funzionale.
Semplicemente queste cose questi effetti vengono rappresentati a livello di types system.
Quindi viene fa viene resa esplicita il fatto che la funzione ha un qualche effetto, e lo si fa in genere esplicitando un il contesto in cui questa funzione sta agendo.
Rocky adesso è un pelino più chiaro.
Ok, quindi semplicemente l'idea di fondo è quella di dire ok lavoro all'interno di un contesto può succedere qualcosa e' il qualcosa è determinato dallo specifico untore che è chiusa.
Però è semplicemente un modo per rendere esplicito a livello di tipi a quello che può succedere.
E invece nel caso la monade che dicevi è un fumatore di un certo tipo e questa è su cosa stava differente allora alla fine l l'idea della monade dopo ovviamente cioè la definizione complessa matematica non è roba per noi.
La la monade anche, cioè poi hai non so, è una class con determinate funzioni che soddisfano alcune regole le mafie, nel senso non è quello la cosa importante, perché dopo si si cade nell'implementazione.
Quello che è importante alla fine è l'idea.
Che cosa? Chi dà in più una monade rispetto a un tutore o perché dovrei usare le monadi quando scrivo codice invece che continuare a scrivere codice, come ho sempre fatto fino ad oggi? E la allora dicevamo l'idea alla monade.
Un punto d'onore quindi a un contesto in cui metto dentro i miei dati e la adesso.
A questo punto la domanda successiva, diciamo a l'idea principale della programmazione funzionale è comporre le cose, cioè scrivere tante piccole che fanno poche cose.
Ogni funzione fa una singola era piccolina e poi comporre, metterle insieme per fare creare cose più complesse.
La solita idea di modularità che si trova un po' in tutti i paradigmi, ogni paradigma, ma dopo lo implementa a suo modo.
Il modo della programmazione funzionale è quello di scrivere tante piccole funzioni e poi comporre dove la composizione di funzioni proprio quella che si trova in matematica, cioè aprendo una funzione f e' una funzione g che e' ah, diciamo che hanno la loro punta di essere, è l'input di Gigi e la composizione di Fca prima se guerre e poi si va oggi, o che che con tutte le proprieta' che ne derivano appunto dal avevano dovuto tutto esatto.
È a questo punto a questo funziona molto bene per A alle funzioni semplici, diciamo da e da mg da B a C.
Le compongo, temo una funzione da Aci, però se ci ricordiamo quello che dicevamo prima quando usiamo i fumatori questi contesti a mettiamo quello che ci interessa è mettere l'output delle funzioni all'interno di un contesto.
Quindi abbiamo una funzione da ha il nostro contesto che racchiude b e abbiamo un'altra funzione da B a ci racchiuso nello stesso contesto.
Il problema adesso è come facciamo a comporre queste due funzioni in maniera naturale? Perché adesso l'output dia eh? Viro ha chiuso in un contesto l'input di g e di non all'interno del contesto e'.
Quello che noi vorremmo riuscire a ottenere è una funzione che prende l'input di F, quindi a e si ritorna l'output dg quindi ci racchiuso nel suo contesto a una monade è semplicemente un particolare untore che ci permette di fare questa operazione attraverso una un'operazione che viene chiamata di solito band.
Comunque è un'operazione che ci permette di prendere queste due funzioni se ci permette di calcolare la composizione di questa di queste due funzioni, quindi ha di quello che ci permette di fare la monade è dì a comporre funzioni il cui output stia in un particolare contesto, chi per cui tiene conto anche del fatto che questa famosa scatolette riesce a gestire elaborazione di queste scatolette.
Diciamola così leva vichingo ah, ci tengo a suggerire, visto che stiamo parlando di questo è che dopo il modo con cui io più o meno sono riuscito a capire questo concetto e dico più o meno per ovvi motivi, è che è un bellissimo libro, non so se lo conosce, lo dico a tutti gli ascoltatori si chiama king al è che un libro illustrato che si impegna proprio a rappresentare concetti algoritmici, alcuni anche molto, abbastanza complessi come appunto il concetto di monadi di fumatore con delle illustrazioni e vi metto il nelle note dell'episodio perché credetemi se l'ho capito io guardando queste illustrazioni può capirlo veramente veramente chiunque.
Scusa Marcos est interrotto ma ci ci tenevano a dare questa indicazione se non stavo stavo mi è venuto in mente adesso c' è anche un blog post e si chiama che penso sia una cosa molto molto simile rispetto a no al vetro per quello eh? Vai mai bookblogging algorithms? Quindi l'autore lo stesso se stiamo parlando esattamente della stessa cosa per te, perché benissimo vuol dire che è una risorsa che effettivamente vale la pena conoscere.
Si'.
Mettiamola link nelle nelle note dell'episodio un altro argomento interessante che anche vediamo spesso che vedo spesso io quando si sente parlare di programmazione funzionale è il concetto di sharing.
Spero di averlo detto nel modo giusto, perché la mia pronuncia inglese, come ripeto ogni episodio aberrante, schifosa.
Quindi quando si parla di lo dico in italiano di curling saranno quasi è cosa ci si riferisce allora qui? Nel senso il contratto è è abbastanza semplice.
Dopo amber cerco di raccontarlo a parole mie, perché stavo pensando che se c'è qualcuno di e' che ho amici che probabilmente tenderebbero le dita se non se non lo dico precisamente usa la giustificazione che dovevi farlo capire a me, anche perché non si scosta la doveva, quindi devi farlo capire a me e di usare necessariamente devi spiegarlo a picconate.
Ecco, te ne sei giustificato.
Ok, allora la l'idea è quella che in per semplificarci le cose in programmazione funzionale vorremmo che tutte le funzioni avessero un solo imputato, in modo da poter dire che è una funzione.
Va sempre da a un input a ritorna un output b è però come tutti sappiamo, non è non ci capita esclusivamente di scrivere funzioni intese come metodi o procedure che abbiano un solo input.
Capita spesso di scrivere che funzioni, metodi o cose che abbiano vari input.
È quindi il caring semplicemente una procedura che ci permette di portare una funzione che ha tanti input ha una funzione che ha un solo input è come si fa a fare questa cosa è semplicemente ah, supponiamo di avere una funzione che prende come input non so, ha un colore e un animale e ci ritorna una persona.
Ok, quindi abbiamo due input che sono colore e animale e ci ritorna una persona Questa cosa noi possiamo riscriverla come una funzione che prende un unico input che è il colore e ritorna un'altra funzione è che prende come input un animale e ritorna una persona.
Quindi il trucco è quello di usare agli errori del fancie's.
Ah, io sto dalla Francia.
Quindi non ritorni più un valore, ma ritorni una funzione e queste due rappresentazioni sono equivalenti.
C' è un modo per andare dall'una all'altra appunto il caring per andare da piu' Argomenti a un solo argomento, ritornando ai lord del fanciullo e caring per andare da funziona con un solo argomento che ritornano al loro re fanciullo ha funzione con più argomenti, quindi sono assolutamente equivalenti e serve appunto per riportarsi sempre al caso in cui le funzioni hanno solo ed esclusivamente un argomento.
A Haskell per per fare un esempio a tutte le funzioni che scriviamo in Haskell ha, anche se ci sembra di scrivere funzioni di più argomenti.
In realtà hanno sempre solo un argomento quello che si può fare se noi abbiamo una funzione in alaska definita che sembra avere due argomenti e noi gliene passiamo solo uno, poi possiamo usare quello che abbiamo ottenuto come una funzione del retro l'argomento è fatto, quindi vinciamo possiamo fare quella che viene chiamata pascià l'application alle funzioni torna particolarmente utile anche in contesti dove non si parla necessariamente di programmazione funzionale.
A noi va assolutamente e' capitato proprio di utilizzarla in contesti dove abbiamo provato a sostituire alcuni pattern della vengo for e qua si apre un altro piccolo capitolo con la programmazione funzionale.
Molti dei pattern è molto del food proveniente da questi pattern si va a ridurre ecco e come vede appunto, e quali secondo te sono i pattern e che sono più facilmente sostituibili con la programmazione funzionale.
Ok, ha ovviamente non me li ricordo tutti a memoria i pattern della gang.
O forse non vedrà il mio mandiamo racconta un attimo quelli quelli che conosco meglio e dopo probabilmente li conosco meglio proprio per perché hanno un sapore funzionale.
È quindi tipo il che ho sempre amato di più è stato il correttore pattern e la che io l'ho sempre, visto che adesso non lo non è vero che l'ho sempre vista.
Adesso lo vedo il correttore.
Si tratta di usare composizione per creare un oggetto che diceva la stessa interfaccia ad oggetto che viene composto è quindi per me questo è ha praticamente abbiamo una funzione da B.
Quindi io vedo l'interfaccia la vedo come un tipo di una funzione e vogliamo semplicemente creare un'altra funzione con la stessa interfaccia, quindi che vada a b ha utilizzando la funzione precedente, quindi per me il decoratore.
A questo semplicemente vogliamo scrivere una funzione con la stessa firma di un'altra utilizzando questa altra funzione e possiamo ridurre anche la quantità di codice in modo significativo.
Un altro che mi viene in mente anche lo Strategy Delta Strategie sembrano una funzione.
Ah si, è un altro paterna come mai facilmente riutilizzabili, diciamo in ambito funzionale alla Cina, il factory a in cui semplicemente ci serve qualcosa per andare a costruire qualcosa altro? Beh, questo qualcosa non è semplicemente una funzione, ci ritorna a quello a cui siamo interessati, quindi alla fine del factor e ti dice solo scrivi una funzione è una funzione diversa dalle altre, è solo perché la usi per un particolare scopo.
Però alla fine, alla fine dei conti euro è una funzione, non è.
Non è niente di diverso che dopo tu la rappresenti nel codice, come una particolare classe che ci dai un'interfaccia o cose sono sono dettagli implementati.
Vi alla fine quello che ti dico, quello che fa alla fine la costruirti un oggetto, quindi è una funzione che ti ritorna, un qualcosa di cui hai bisogno assolutamente.
Ci tengo a suggerire a questo punto, visto che abbiamo parlato di pattern, un solco di diversi anni fa di Mario Fusco e', uno dei piu' importanti sviluppatori, anche un giovane scempio che appunto racconta il suicidio tra i partner della gang.
O forse è gli approcci funzionali, quindi prende pattern per e ne spiega l'alternativa funzionale veramente interessante.
Lo mettiamo nelle nelle note dell'episodio perche' mi piaciuto tantissimo qualcosa, devo dire tantissimo.
Domanda in realtà tu sei anche uno sviluppatore php come fai a far convivere funzionale in un linguaggio più lavorando su un linguaggio che comunque diciamo ha dei limiti dal punto di vista funzionale, almeno si percepiscono tali? Allora e' stata una gran bella domanda del senso.
Io sono cresciuto abbastanza come come programmatore php alla fine il linguaggio con cui ho lavorato di più e su cui alla fine lavoro anche oggi al lavoro eh, però penso di scrivere capì abbastanza diverso dal dal php standard è perché comunque io cerco sempre di ho sempre in mente un tornando un po' a mentire quando sai diceva prima un modello del codice ha basato sulla programmazione funzionale.
Quindi anche se se uso oggetti, metodi, interfacce fine a quello che ho in mente a sono sempre a funzioni e tipi di dato e e alla fine dei conti sì, è un linguaggio che non è fatto, non è nato e non non si è anche voluto necessariamente in questa direzione.
È però comunque non è neanche non però comunque è possibile a possibile farlo senza troppa fatica a secondo me la cosa che manca di piu' per scrivere in maniera seria programmazione funzionale in è un sistema evoluti aiuti veramente lo sviluppatore a tener traccia della delle cose di cui di cui vuole parlare.
Però per fortuna, anche se manca a livello di linguaggio alla il fatto che ci sia adesso da a, diciamo ha permesso la nascita di librerie che praticamente danno in mano allo sviluppatore.
Una ha un sistema a livello di libreria e sto parlando principalmente di libreria di analisi statica come php stanno o salma salve ah, è che sono la finanza io io le vivo queste librerie come dei compilatori è quindi io la tratto per quanto riesco io cerco il mio modo di lavorare e avere a far girare questa libreria ogni salvataggio della del mio fai in modo da avere un feedback immediato dal mio compilatore è che mi dice se sto rispettando i tipi che ho scritto oppure no, in modo da avere un feeling molto simile a quello di un linguaggio compilato come può essere appunto a chela.
Ma ho altri linguaggi oltre linguaggi funzionali e la ha sempre grazie a php stanno salma si possono usare praticamente cose molto affini a quelli che sono tipo i generics, quindi è che un altro stato a oltre un che permette di avere tipi più ha più complicati e più espressivi e quindi in questo modo l'espressività del taxi stende il linguaggio.
Devo dire non è non è così, non è così terribile dopo, ovviamente richiede molto, molto esercizio è sicuramente diventa anche molto verboso da un punto di vista al codice, perché in qualche modo bisogna avere la pazienza di annotare tutte le cose che si scrivono a con con il tipo che che vuoi che quella cosa sia è quindi la l'aveva experience non è così magnifica in php è però è per dire che se uno vuole fare le cose in questo modo si può fare.
Non è il linguaggio nel senso.
Se dovessi scegliere un linguaggio per fare le cose in questo modo non sceglierai diakhaby, ma lavorando in per le aziende e i suoi fianchi è un asset imprescindibile a possibile e il risultato non è brutto risultato.
Anzi è ecco dice a mio a mio parere è codice di ottima qualità tra l'altro e ti permette anche di eliminare tantissimi test perche' il controllo sui tipi, poi alla fine ti alleggerisce di quei tipo di una marea di cech che in realtà faresti in ambito di testa, no? Ah, si' assolutamente.
Perché senso a deleghi molta conoscenza quello che a quello che il compilatore quindi è il compilatore io glielo chiamo compilatore non è non è effettivamente un compilatore, ma io lo vedo così le deleghe a lui il fatto di controllare un sacco di cose è quindi se esprimi qualcosa a livello di sistema ah, allora basta, sei tranquillo lei espresso la non c' è bisogno di scrivere un testo per controllare che quella cosa faccia effettivamente quello che tu gli stai chiedendo, perché sai che hai qualcun altro che lo sta controllando e quindi ha dovuto ovviamente è necessario avere questo controllo in continuo integration o comunque farlo girare abbastanza spesso perche', altrimenti crolla tutto in però diciamo la cosa ha decisamente fattibile.
Domanda perché non scrivo codice php da un pochino, quindi in realtà sono sono un po' indietro esiste per Salma o qualcosa tipo un po'? Quello che si ha con visual studio code thaek, script legato più all'editore che avvia dei ciechi, per cui anche in fase di scrittura del codice che ne so, cioè un sistema nell'editor che ti permette quasi in realtà, ma di evidenziati degli elementi, allora credo che ci sia parzialmente.
So che a php stormo deve avere implementato recentemente, quindi non so neanche se sia già stato rilasciato.
Se sarà una cosa rilasciata nella prossima versione è una integrazione per capire i tipi di salma è quindi in questo modo quando ci sarà che potrebbe esserci già, però io non non ne sono, non sono sicuro della cosa è comunque dopo dovrebbe esserci una php torna a per permettere alla leader di capire le annotazioni con i tipi a quel punto si quel tutte quelle cose diventano controlli che il leader riesce a fare in quel modo in automatico, cioè come figata sei capace di integrare non so il l'inter ha a questo punto può integrare anche i controlli di analisi statica nel ride era proprio l'idea segnalarti con una sorta di sottolinea il rosso o cose del genere con gli input grafici, il fatto che appunto il tuo dna di statica ha trovato qualcosa di ah da sistemare giocando e scrive scrive dodicenni script e' una cosa che ho trovato particolarmente utile.
Proprio questo questo feedback in real time la sifilide, alla fine all'idea di avere un compratore è quella che si vede sempre di più nell'ambito della programmazione funzionale, dove lo studio è proprio nel fare compilatori sempre più avanzati è proprio quella di tendere a verso compilatori con cui proprio dialogare nel senso compila scrive del codice il compilatore ti dice qualcosa e tu dai nuovo informazioni al compilatore.
Il compilatore a sua volta ti ritorna qua.
Una domanda dice non riesco a capire questa cosa.
Tu fornisci l'informazione e si va avanti così, diciamo creando proprio un dialogo tra lo sviluppatore, il compilatore.
Certo, rimaniamo sempre per un attimo sul che e ho visto che è nel tuo perché ho fatto i compiti a casa sono andato un po' a spulciare in giro in modalità zero zero sette ho visto una che qualche giorno fa lavoravi a un repo che si chiama l'ampiezza cp da ci vuole raccontare un po'.
Di cosa si tratta? Sì, volentieri.
Allora una libreria altamente mentale per il momento su cui sto lavorando un po' a tempo perso.
Ehi, era semplicemente una libreria php che si propone di implementare alcune strutture dati funzionali.
Quindi, tornando alle parole di prima al punto rie monadi ai più classici diciamo a per a prenderli a utilizzabili nel mondo ci sono il disclaimer e ci sono gia' librerie nel mondo php che fanno cose del genere il differenziato re che vorrei dare alla mia libreria è di ha parla in modo che sia fortemente stipata a ci sono già libera e che danno una simile a quella che vorrei proporre io eh, ma secondo me il difetto è che non essendo fortemente ti paté, eh ti permettono ancora di scrivere codice che non dovrebbe essere valido il codice che ha fatto tirare avanti sai, ma fallisce chi genera un errore in fatal error o cose del genere l'obiettivo che avrei io è quello di scrivere codice che una volta che sal ma in questo caso ti dice che non ci sono errori.
Poi aran time sei tranquillo che quel codice funziona.
Neanche di questo mettiamo per quelli piu' coraggiosi che vogliono spulciare il link nelle nelle note degli episodi abbiamo parlato ragazzi ripetuta sì, poi mettiamo naturalmente anche i tuoi contatti peggio per te che sei il ritratto della nostra famiglia che abbiamo parlato ripetutamente di Salma e Pistelli e dalla tua esperienza che differenze ci sono tra questi? Due tulle? Quale preferisci? È perché allora guarda, non so darti una risposta analitica della cosa dicendo to si differenziano in questo in questo una maglia in questione meglio in quello so solo che durante l'uso di uno sviluppo di un'altra libreria è su cui ho lavorato e ci ha usati entrambi perché ho detto vabbè, sono due tool separati perche' usarne perché fare sceglierne uno l'altro? Si possono tranquillamente usare tutti e due insieme e la e quindi in questo modo è venuto naturale alla fine a fare fare un confronto della del come funzionano i i due tully e al tempo amy sono trovato meglio nel senso l'esperienza finale quello che la libreria riusciva a capire del mio codice ha funzionato meglio salma.
Ah, quindi per la mia esperienza io mi sono trovato meglio sano, ma è una cosa assolutamente soggettiva.
Non voglio dire che salme meglio di hp stampante è sicuramente non sicuramente altra cosa che credo è che in linea di massima sia piu' integrato con i framework e con le librerie tipo doctrina altri strumenti, quindi ha per un progetto più standard, quindi che usa molti nulla di framework di librerie assodata nel mondo php.
In linea di massima è più facile integrare, mentre salma è più un qualcosa che da quello che ho visto io è più facile usare per a codice a, diciamo doc è una cosa che non sono sicuro che al tempo aveva notato che mi facilitava di molto.
Il lavoro è che se a un certo punto ti capita ad arrivare in un punto del codice dove tu sviluppatori ne fai di più, ha del tulle e quindi vuoi dire al tool no, questa cosa non è sbagliata.
Ho ragione io? Credimi eh, era molto piu' facile dire questa cosa in psalm o semplicemente mettendo una notazione in linea dicendo a tipo psalms soppressa il nome dell'errore è piuttosto che in piu' tanna dove ha l'eccezione dell'eccezione inteso devi dire alla regola anche non controlli quella.
Quella cosa lì andava inserita in un file xml che ti sta nella rotta del codice con una particolare assentarsi usando la pratica delle a dire il vero era un po' più complicato.
Non so se adesso anche php stanno abbia cio' che volevano farlo abbia un meccanismo simile.
Quindi potrebbe essere che se questa cosa adesso si si equivalgono i due sistemi.
Capito? Io in realtà non ho grosse esperienze esperienze in merito, quindi non non ho molto da aggiungere.
Però sì, se posso aggiungere, per chi vuole provarle, direi installate li' entrambi e fatevi un'idea per conto vostro e a un certo punto, quando vi rendete che uno dei due nulla vi da' piu' a rottura di scatole, che valore allora lo togliete? Che questo questo è assolutamente una cosa intelligente, anche perché in quel caso si si matura un'esperienza un pelino più completa, eh? Domanda.
Da questo punto di vista, quando sentiamo parlare di programmazione funzionale, spesso ci si sente parlare anche di programmazione più utile o utilissima in contesti dove appunto si parla di calcolo parallelo e di queste cosine qua, perché spesso si fa questo tipo di associazione, allora beh, in linea di massima il motivo è perché in programmazione funzionale a chi stai sono vietati e sai da Brecht in programmazione parallela sono in via di mattina.
Una cosa ho detto non prendendo no, vendono molto a mangiarti, a morderti nel sedere e soprattutto se sono operazioni che magari agiscono su uno stato condiviso, il fatto di lanciarla in parallelo rischia veramente di far saltare, di far saltare il banco.
E visto che in programmazione funzionale tutte queste cose sono a in linea di massima vietate, dopo dove? Con vietate e non voglio dire che non si possono fare in programmazione funzionale, voglio dire che in programmazione funzionale uno deve renderle esplicite e rendere esplicite vuol dire dichiararli a livello di tipi e quando sono dichiarate a livello di tipi vuol dire avere l'accortezza dopo per far funzionare le cose.
Un costretto a gestire queste a queste casistiche è quindi è possibilissimo in tasca scrivere a codice parallelo su uno stato immutabile ha però esistono librerie che praticamente prendono tecniche, dalla Ah dallo sviluppo alla formazione di database, dove le operazioni transnazionali sono un elemento di base e lo portano nella programmazione normale.
Quindi ci sono librerie che si chiama appunto dietro al management che permettono di in programmazione parallela concorrente, a rendere l'accesso allo stato un'operazione transazionale.
Quindi ci si può accedere anche da piu', da piu' trad concorrente, ma essere sicuri che solo uno alla volta andrà andrà ad accedere a quello stato e quindi questo ci permette di sapere che non ci saranno conflitti.
Non ci saranno da o comunque se queste cose possono succedere vengono rese esplicite a livello di sistema e quindi devono poi essere gestita.
È quindi questo porta lo sviluppatore a a essere costretto a gestire anche tutti i casi limite che poi alla fine sono quelli che ci portano a creare bug perche' di solito dello sviluppato riesce a svilupparlo abbastanza tranquillamente sono tutti i casi di niente tutti gli averi amar di modo che sono quelli che spesso ci dimentichiamo di gestire è di non fare il calcio, delle eccezioni di di tutte queste cose che diciamo ma si quando mai succederà che è quel servizio non mi risponde che non mi risponde al database vuoi marchio che ho dietro l'angolo si fa la sua capita e dobbiamo vestirci la cosa la programmazione funzionale a pensare a queste cose a priori, quindi side effects ma se n'e' se te ne prendi la responsabilità dovendo riassumere in in modo brutale e intanto inizia a ringraziare per averci in qualche modo accompagnati in questo esperimento ti faccio le ultime due domandine che sono è comunque mia banda meno tecniche per chi dovesse iniziare la programmazione funzionale.
E meglio un linguaggio di programmazione funzionale puro, come può essere Haskell che sembra davvero pochino esoterico o un linguaggio un po' più lasco che ti permette anche di giocare con gli oggetti.
Faccio un esempio una scala della situazione no, questa è la prima parte.
Lo dico perché in realtà la prima volta che io ho visto Haskell e ho chiuso la finestra del browser terrorizzato perche' la la la la la la la la pendenza della curva d'apprendimento mi sembrava molto, molto ripida.
Tu cosa consigli dalla tua esperienza allora? Secondo? Ma il per imparare programmazione funzionale io consiglierei di cercare almeno all'inizio di tagliare un po' i ponti con la programmazione oggetti, quindi il mio consiglio personale di non andare in linguaggi tipo scala che ti permettono di fare in qualche modo un po' di confusione e io sarei più per consigliare linguaggi funzionali semplici è tipo Helm è che è fatto proprio a un linguaggio pensato per essere a un linguaggio puramente funzionale fortemente t Pato, ma senza un sacco di complicazioni che poi emergono i linguaggi più avanzati, tipo Haskell e' che non e' anche il sesso ho pensato per essere relativamente facilmente apprezzabile, quindi anche la documentazione i tutorial thelma sono indirizzati ad un pubblico ha generalmente diverso rispetto al pubblico che ha scritto.
Quindi, mentre alma pensato per essere a un linguaggio indirizzato, soprattutto programmatori, java scherza ma ah, programmatore web che vogliono fare lavorare nel web haskell spesso accade molto nella documentazione che assume la conoscenza di concetti matematici e quindi è un po' più un po' più ostico da digerire.
E però diciamo la cosa che blocco di più secondo me per un approccio.
Ma quello che sto suggerendo è la forte differenza nella sintassi è perché appunto la facilità di passare la programmazione funzionale attraverso scala non sono mai passa dal fatto che la sintassi e alla fine si continua a scrivere cose che sono classiche sono oggetti e quindi ci si continua ad avere questo questo sentore di programmazione oggetti anche se si introducono concetti tipo immutabilità e type reunion hai per cose del genere che poi aiutano quando si arriva alla programmazione funzionale eh dall'altro il la difficoltà di passare linguaggi tipo alma appunto quello la sintassi è completamente diverso perché la sintassi dm praticamente quella di pascal quindi questa forte difficoltà all'inizio e il però nel senso imparare una nuova sintassi.
E siccome non è una cosa così impegnativa, magari lo shopping di paradigma, quello piu' seguendo il tutorial, la leggenda provando a scrivere un po', il secondo me il ma è una cosa che nel giro di una settimana, qualche oretta al giorno uno inizia a entrare nell'ordine delle idee è quindi se uno ha voglia di iniziare a provare a programmazione funzionale, sa che ha un attimo quello scoglio della sintassi se la mette via inizio il compilatore, gli dà degli errori che lui non si aspettava, perché magari non lo so, ha messo la parentesi nel posto sbagliato o cose del genere.
È però passato questo primo questo primo scoglio dopo ha abbastanza un navigare più tranquillo rispetto a secondo me ha rispetto, secondo me, appunto il paragone con scala, dove la sintassi, lo scoglio della sintassi annuncia è però proprio come perché questa sintassi ti permette di fare molto simili a quelle che che sempre fatto fino a quel punto fai molta più fatica da quello che ha il modo standard di fare.
Vero, ovviamente a ciascuno.
A ciascuno assumo io.
Questa è la mia esperienza da ognuno la può vivere in maniera completamente diversa.
Sì, noi comunque facciamo del tuo consiglio oro e e ti ringraziamo per questo è Marco.
Io ti ringrazio a nome degli ascoltatori di Barea a nome mio naturalmente, era noi ci prendiamo qualche istante per ricordare i tuoi contatti e so che sei attivo anche nel mondo delle community, quindi se ti fa piacere anche dare qualche indicazione, perché per noi è molto importante, comunque è dare delle indicazioni e spingere gli ascoltatori a partecipare attivamente al mondo delle community perche'.
Diciamo che quello strumento è uno di quegli strumenti che permettano di si trasforma in un acceleratore, non un acceleratore di competenze che nella nostra professione è comunque molto importante.
Assolutamente.
Per questo ti ringrazio dello spunto e io sono un un organizzatore.
Ha di gruppo qui di Treviso che si chiama Magda, che sta per marca Group è che è una gruppo non focalizzato su una specifica tecnologia che si ritrovava.
Intendo perché ultimamente non era possibile farlo e quindi ci siamo trovati.
Ci siamo trovati virtualmente, è più o meno una volta al mese qui in zona Treviso, con una control c'ha da parte un po' dei vari partecipanti, ma anche di ospiti che che viaggiano un po' per per venire da noi e un'altra, cosa che mi viene voglia di dire è che purtroppo non ce l'abbiamo fatta quest'anno sempre a causa coronavirus ma con con degli amici era era avvenuta forte la voglia e avevamo iniziato a lavorarsi per organizzare una conferenza di programmazione funzionale in italia e quindi mi viene da dire speriamo che il sia l'anno buono per farlo.
Allora noi e lasciamo i nostri microfoni aperti in modo da quando avrete modo di realizzare questo incontro, regalarvi i nostri microfoni per appunto condividerlo anche con la nostra per quanto piccola comunque comunità.
E per quanto riguarda invece i tuoi contatti marco dove si possono trovare allora? Beh, principalmente i posti dove è più facile a trovarmi oltre che a casa mia eh sono su twitter dove sono marco sciattone e oppure su github a dove sono marco e dirai che ha il mio un blog che a marco punto di abby appunto comma dove ogni tanto senza assolutamente nessuna cadenza regolare a scrivere un po' le idee che mi vengono in mente delle cose che che mi interessano quindi se volete darci un occhio e sono molto contento di interagire.
Se qualcuno ha domande e curiosità o critica di qualunque tipo l'altro, ci tengo ad aggiungere che è proprio questo pomeriggio.
Ho letto un bellissimo articolo sulla qualità del codice nel tuo blog e quindi tutti i tuoi contatti andranno a finire nelle note dell'episodio.
Io non so come ringraziarti per averci dedicato questo retta acqua subito! Grazie davvero, grazie mille a voi è stato un grande piacere.
Alla fine mai parlare di programmazione funzionale mi piace un sacco, quindi aveva visto fare con voi è stato un grande piacere.
Allora facciamo così quando capita siamo in Veneto o se Peter hai tu in zona a Lione o Sardegna Olbia d'estate forse più probabile latti dobbiamo una pizza e una e una birra.
Grazie mille e grazie di nuovo era Marco che ci ha dato una mano per esplorare il mondo della programmazione funzionale.
Vi ricordo i nostri contatti prima di lasciarli visto che la settimana scorsa le ho dimenticate potete trovarci su bar punto i per qualunque motivo potete scriverci al settembre.
Il repo su Twitter La chiacchierata con con Marco mi ha aiutato tantissimo anche personalmente, visto che ho sempre la curiosità di esplorare la programmazione funzionale, quindi non ditelo a lui, ma mi riservo il diritto di rompergli le scatole.
Magari su Twitter.
Lo so che mi stai ascoltarlo.
No, tranquilla.
Detto questo, io vi ricordo che potete iscrivervi nel podcast utilizzando il vostro cliente preferito.
È perché no? Serviva.
Lasciate pure una recinzione.
Noi ci incontriamo la prossima settimana con un nuovo argomento della cassetta degli attrezzi dei fusti.
Davvero? Perché il circolo dei fusti da bere? Una volta a settimana ci troviamo davanti a due birre e comprerebbe.
Parliamo di linguaggi e tecniche di sviluppo web, di metodologie e degli strumenti immancabili nella cassetta degli attrezzi dei fusti.
Ho bisogno di una mano. Aiutami a rendere più conosciuto il nostro podcast. Parlane con gli amici o con i colleghi e iscriviti usando Apple Podast o Google Podcast. Questa tua azione ci aiuterà a salire nella classifica dei podcast di tecnologia ed essere utili anche a qualcun’altro. Se non ti va, amici come prima😄