C# Language EvolutionMarco ParenzanElementi di C# 1.0
Delegati ed eventi. Eccezioni. Enumeratori.
Elementi di C# 2.0
Static Classes. Generics e collezioni generiche.Nullable Types. Partial Types e Partial Classes. Anonymous Methods.Iteratori,
Elementi di C# 3.0
Auto-implemented properties.Object Initializers e Collection Initializers. Implicit Typed Variables. Anonymous Types.Extension Methods. Lambda Expression.
Corso Programmazione Java BaseK-Tech FormazioneIl Corso Programmazione Java Base di K-Tech (http://www.k-tech.it) ha come obiettivo quello di far comprendere le tecniche di programmazione orientata agli oggetti, cioè di modellare e “pensare” a oggetti, di trasmettere i concetti base del linguaggio e le basi per sviluppare piccole applicazioni in modo autonomo.
Il corso Programmazione Java Base è composto da dodici moduli:
1. Introduzione
2. Ciclo di sviluppo
3. Sintassi Elementare
4. Principi OOP
5. Classi e Oggetti
6. Concetti Object Oriented
7. Collections
8. Eccezioni
9. Input Output
10. Serialization
11. Unit Testing
12. Threads
Leggi il programma completo: http://www.k-tech.it/formazione/catalogo/programmazione_java_base
Javaday 2006: Java 5Matteo Baccan50 minuti per svelare la tigre, il cavallo e sapere che esiste il delfino.
La nuova versione di Java implementa caratteristiche che da tempo erano attese
nello standard del linguaggio: Metadata, Generic Types, AutoBoxing e
Unboxing dei tipi primitivi, Static import, gestione dinamica dei Loop e delle
Enumeration.
Per Java 6: gestione di SystemTray e motori di scripting.
Vediamo di cosa si tratta e di come poter utilizzare queste nuove feature all'interno dei nostri programmi
2010.11.19 iniziare con F#Marco ParenzanIn Visual Studio 2010 è apparso un nuovo linguaggio: F#. Cos'è, da dove nasce, come si scrive in F#. E perchè tanti lo stanno apprezzando più di C#...
C# Language EvolutionMarco ParenzanElementi di C# 1.0
Delegati ed eventi. Eccezioni. Enumeratori.
Elementi di C# 2.0
Static Classes. Generics e collezioni generiche.Nullable Types. Partial Types e Partial Classes. Anonymous Methods.Iteratori,
Elementi di C# 3.0
Auto-implemented properties.Object Initializers e Collection Initializers. Implicit Typed Variables. Anonymous Types.Extension Methods. Lambda Expression.
Corso Programmazione Java BaseK-Tech FormazioneIl Corso Programmazione Java Base di K-Tech (http://www.k-tech.it) ha come obiettivo quello di far comprendere le tecniche di programmazione orientata agli oggetti, cioè di modellare e “pensare” a oggetti, di trasmettere i concetti base del linguaggio e le basi per sviluppare piccole applicazioni in modo autonomo.
Il corso Programmazione Java Base è composto da dodici moduli:
1. Introduzione
2. Ciclo di sviluppo
3. Sintassi Elementare
4. Principi OOP
5. Classi e Oggetti
6. Concetti Object Oriented
7. Collections
8. Eccezioni
9. Input Output
10. Serialization
11. Unit Testing
12. Threads
Leggi il programma completo: http://www.k-tech.it/formazione/catalogo/programmazione_java_base
Javaday 2006: Java 5Matteo Baccan50 minuti per svelare la tigre, il cavallo e sapere che esiste il delfino.
La nuova versione di Java implementa caratteristiche che da tempo erano attese
nello standard del linguaggio: Metadata, Generic Types, AutoBoxing e
Unboxing dei tipi primitivi, Static import, gestione dinamica dei Loop e delle
Enumeration.
Per Java 6: gestione di SystemTray e motori di scripting.
Vediamo di cosa si tratta e di come poter utilizzare queste nuove feature all'interno dei nostri programmi
2010.11.19 iniziare con F#Marco ParenzanIn Visual Studio 2010 è apparso un nuovo linguaggio: F#. Cos'è, da dove nasce, come si scrive in F#. E perchè tanti lo stanno apprezzando più di C#...
Programmazione funzionale: un primo approccio attraverso F#Commit UniversityMario De Ghetto introduce la programmazione funzionale e il linguaggio F# al workshop di CommitUniversity
What is new in C# 2018Marco ParenzanC# is entering its third decade of life. And it is consistently evolving over the years with lot of new features. Let's recap the recent 7.x evolution and what we expect for the 8.0 features.
DDive11 - Notes Moon AttackDominopoint - Italian Lotus User GroupSviluppare funzionalità aggiuntive di utilizzo comune centralizzandone il codice. Realizzare vere e proprie applicazioni mantenendo separati codice e dati. Creare strumenti di sviluppo personalizzati estendendo le potenzialità del Lotus Domino Designer. Integrare Symphony nelle applicazioni Notes.
Sono solo alcune delle opportunità offerte agli sviluppatori Domino dall'ambiente Eclipse.
Per chi, come chi scrive (classe Lotus Notes 4.5), fa parte della vecchia guardia "LotusScript & Formule" può non essere così spontaneo abbandonare tecniche consolidate cercando nuove soluzioni a necessità note (il lato oscuro della retrocompatibilità) ma le potenzialità offerte dal lunare e multipiattaforma IDE sono tali da meritare, demo alla mano, ben più di una possibilità.
Ripetete con me: Nooootes Moooon Attaaaack!
#dd12 grillo daniele_xpages_tips_tricks_rev2Dominopoint - Italian Lotus User GroupXPages, trucchi e soluzioni sullo sviluppo applicativo IBM Lotus Notes
Code Generation con i templates T4 in visual studioMarco ParenzanUno degli strumenti meno pubblicizzati ma più utili in Visual Studio sono i templates T4. Strumenti come l'Entity Framework e ASP.NET MVC li hanno resi (forse) più diffusi. Come sono fatti? Come si usano? Cosa ci si può fare? Una carrellata di alcuni usi interessanti, dagli oggetti POCO a WPF, passando attraverso lo "scaffolding" e i Domain Specific Languages...
Corso di Basi e Fondamenti di Programmazione in C++ Lezione 1Daniele FalamescaArgomenti Trattati nel Corso:
Fondamenti
Costruttori del Linguaggio
Vettori
Record
Funzioni
Ricorsione
Puntatori
Strutture Dinamiche
Programmazione ad Oggetti
Nel Corso saranno presenti circa 60 Esercizi Svolti per aiutarvi a comprendere i concetti delle Lezioni
Azure IoT Central per lo SCADA engineerMarco ParenzanNormalmente parliamo e presentiamo Azure IoT (Central) con un taglio un po' da "maker". In questa sessione, invece, vediamo di parlare allo SCADA engineer. Come si configura Azure IoT Central per il mondo industriale? Dov'è OPC/UA? Cosa c'entra IoT Plug & Play in tutto questo? E Azure IoT Central...quali vantaggi ci da? Cerchiamo di rispondere a queste e ad altre domande in questa sessione...
Azure Hybrid @ HomeMarco ParenzanAllo sviluppatore Azure piacciono i servizi PaaS perchè sono "pronti all'uso". Ma quando proponiamo le nostre soluzioni alle aziende, ci scontriamo con l'IT che apprezza gli elementi infrastrutturali, IaaS. Perchè non (ri)scoprirli aggiungendo anche un pizzico di Hybrid che con il recente Azure Kubernetes Services Edge Essentials si può anche usare in un hardware che si può tenere anche in casa? Quindi scopriremo in questa sessione, tra gli altri, le VNET, le VPN S2S, Azure Arc, i Private Endpoints, e AKS EE.
Static abstract members nelle interfacce di C# 11 e dintorni di .NET 7.pptxMarco ParenzanDid interfaces in C# need evolution? Maybe yes. Are they violating some fundamental principles? We see. Are we asking for some hoops? Let's see all this by telling a story (of code, of course)
Azure Synapse Analytics for your IoT SolutionsMarco ParenzanLet's find out in this session how Azure Synapse Analytics, with its SQL Serverless Pool, ADX, Data Factory, Notebooks, Spark can be useful for managing data analysis in an IoT solution.
Power BI Streaming Data Flow e Azure IoT Central Marco ParenzanDal 2015 gli utilizzatori di Power BI hanno potuto analizzare dati in real-time grazie all'integrazione con altri prodotti e servizi Microsoft. Con streaming dataflow, si porterà l'analisi in tempo reale completamente all'interno di Power BI, rimuovendo la maggior parte delle restrizioni che avevamo, integrando al contempo funzionalità di analisi chiave come la preparazione dei dati in streaming e nessuna creazione di codice. Per vederlo in funzione, studieremo un caso specifico di streaming come l'IoT con Azure IoT Central.
Power BI Streaming Data Flow e Azure IoT CentralMarco ParenzanDal 2015 gli utilizzatori di Power BI hanno potuto analizzare dati in real-time grazie all'integrazione con altri prodotti e servizi Microsoft. Con streaming dataflow, si porterà l'analisi in tempo reale completamente all'interno di Power BI, rimuovendo la maggior parte delle restrizioni che avevamo, integrando al contempo funzionalità di analisi chiave come la preparazione dei dati in streaming e nessuna creazione di codice. Per vederlo in funzione, studieremo un caso specifico di streaming come l'IoT con Azure IoT Central.
Power BI Streaming Data Flow e Azure IoT CentralMarco ParenzanSince 2015, Power BI users have been able to analyze data in real-time thanks to the integration with other Microsoft products and services. With streaming dataflow, you'll bring real-time analytics completely within Power BI, removing most of the restrictions we had, while integrating key analytics features like streaming data preparation and no coding. To see it in action, we will study a specific case of streaming such as IoT with Azure IoT Central.
Developing Actors in Azure with .netMarco ParenzanWhat are the actors? What are they used for? And how can we develop them? And how are they published and used on Azure? Let's see how it's done in this session
Math with .NET for you and AzureMarco ParenzanGeneric Math, funzionalità ora schedulata per .NET 7, e Azure IoT PnP mi hanno risvegliato un argomento che nel mio passato mi hanno portato a fare due/tre viaggi, grazie all'Università di Trieste, a Cambridge (2006/2007 circa) e a Seattle (2010, quando ho parlato pubblicamente per la prima volta di Azure :) e che mi ha fatto conoscere il mito Don Box!), a parlare di codice in .NET che aveva a che fare con la matematica e con la fisica: le unità di misura e le matrici. L'avvento dei Notebook nel mondo .NET e un vecchio sogno legato alla libreria ANTLR (e tutti i miei esercizi di Code Generation) mi portano a mettere in ordine 'sto minestrone di idee...o almeno ci provo (non so se sta tutto in piedi).
.net for fun: write a Christmas videogameMarco Parenzan322 / 5,000
Translation results
.NET is better every year for a developer who still dreams of developing a video game. Without pretensions and without talking about Unity or any other framework, just "barebones" .NET code, we will try to write a game (or parts of it) in the 80's style (because I was a kid in those years). In Christmas style.
Building IoT infrastructure on edge with .net, Raspberry PI and ESP32 to conn...Marco ParenzanThe document discusses building an IoT infrastructure on the edge with .NET that connects devices like Raspberry Pis and ESP32s to Azure. It describes setting up a network of Raspberry Pi devices running .NET Core and connecting sensors to collect data and send events to an Apache Kafka cluster. The events are then aggregated using Apache Spark on another Raspberry Pi and the results routed to the cloud. Issues encountered include Kafka's Java dependencies, Spark's complex processing model, and lack of documentation around integrating Pi, Kafka and Spark. While the technologies work individually, configuring and integrating them presented challenges at the edge.
Anomaly Detection with Azure and .NETMarco ParenzanHow can you handle defects? If you are in a factory, production can produce objects with defects. Or values from sensors can tell you over time that some values are not "normal". What can you do as a developer (not a Data Scientist) with .NET o Azure to detect these anomalies? Let's see how in this session.
Deploy Microsoft Azure Data SolutionsMarco ParenzanQuali vantaggi ci da Azure? Dal punto di vista dello sviluppo software, uno di questi è certamente la varietà dei servizi di gestione dei dati. Questo ci permette di cominciare a non essere SQL centrici ma utilizzare il servizio giusto per il problema giusto fino ad applicare una strategia di Polyglot Persistence (e vedremo cosa significa) nel rispetto di una corretta gestione delle risorse IT e delle pratiche di DevOps.
Deep Dive Time Series Anomaly Detection in Azure with dotnetMarco ParenzanLet's explore in deep how to make Time Series Anomaly Detection, from IoT data and how Azure services can serve this way.
Azure IoT CentralMarco Parenzan- Azure IoT Central provides a fully managed platform for building IoT solutions that is compliant with the Azure IoT platform.
- It offers predictable pricing per device, forces useful modeling practices like device twins and plug and play, and provides industry templates to accelerate solution building.
- While it handles much of the complexity, it also maintains compatibility with customizing solutions using the full Azure IoT platform and other Azure services.
Anomaly Detection with Azure and .netMarco ParenzanCome puoi gestire i difetti? Se sei in una fabbrica, la produzione può produrre oggetti con difetti. Oppure i valori dei sensori possono dirti nel tempo che alcuni valori non sono "normali". Cosa puoi fare come sviluppatore (non come Data Scientist) con .NET o Azure per rilevare queste anomalie? Vediamo come in questa sessione.
Code Generation for Azure with .netMarco ParenzanIt happens that we have to develop several services and deploy them in Azure. They are small, repetitive but different, often not very different. Why not use code generation techniques to simplify the development and implementation of these services? Let's see with .NET comes to meet us and helps us to deploy in Azure.
Running Kafka and Spark on Raspberry PI with Azure and some .net magicMarco ParenzanIoT scenarios necessarily pass through the Edge component and the Raspberry PI is a great way to explore this world. If we need to receive IoT events from sensors, how do I implement an MQTT endpoint? Kafka is a clever way to do this. And how do I process the data in Kafka? Spark is another clever way of doing this. How do we write custom code for these environments? .NET, now in version 6 is another clever way to do it! And maybe, we also communicate with Azure. We'll see in this session if we can make it all work!
Time Series Anomaly Detection with Azure and .NETTMarco Parenzanf you have any device or source that generates values over time (also a log from a service), you want to determine if in a time frame, the time serie is correct or you can detect some anomalies. What can you do as a developer (not a Data Scientist) with .NET o Azure? Let's see how in this session.
4. Programmazione ImperativaNella programmazione imperativa, i concetti principali sono:Lo stato (le variabili)L’assegnazione (delle variabili)La sequenza delle operazioni (che cambiano lo stato delle variabili)ProsApproccio «naturale»«The hardware implementation of almost all computers is imperative »Ad un certo punto l’esecuzione va fattaQuando viene insegnato il concetto astratto di algoritmo, viene implicitamente richiesto di essere gli «esecutori»ConsLa gestione dello stato può essere complicata ed è spesso causa di erroriForse abusiamo delle variabiliSempre di più ora che si parla di parallel e distributed programming
5. Programmazione Orientata agli OggettiDa Wikipediahttp://en.wikipedia.org/wiki/Object-oriented_programming«...i dati vengono espressi in termini di strutture contenenti campi e metodi...»La programmazione orientata agli oggetti è implicitamente imperativa, in quanto è «stato» assieme ai metodi che permetto di «cambiare questo stato»Nel nostro ragionamento, quindi, non ci interessaI concetti di OOP non ci danno niente in più nel confronto Imperativo vs. FunzionaleComunque parleremo di F# e OOP
8. Programmazione Funzionale e .NETC# 3.0 (rilasciato con .NET Framework 3.5) implementa alcuni aspetti della programmazione funzionale (http://tomasp.net/articles/csharp3-concepts.aspx)Lambda ExpressionQuando le funzioni possono essere create a runtime, possono essere memorizzate in strutture dati, essere passate come parametri o ritornate come risultatiType Inference (Inferenza di tipo)Dedurre il tipo dall’espressione, non dalla annotazione della variabile (che, in caso di ambiguità, si può ancora usare)Anonymous TypesTipi definiti dall’usoMetaprogrammingÈ lo scrivere programmi che scrivono o manipolano altri programmi (se scrivono o manipolano se stessi, si dice «reflection»)Le Expressions e gli Expression Trees sono i fondamenti del metaprogramming in .NET 3.5/sp1/4.0 (oltre alla Reflection...)In realtà sono: syntactic sugar e librerieCosa succede se questi concetti entrano nella definizione del linguaggio sin dall’inizio?
10. Programmazione DichiarativaNella programmazione dichiarativa, i concetti principali sono:Le proprietà (esplicitare dei valori)I vincoli (esplicitare le regole cui devono sottostare valori non esplicitati) ProsMigliore astrazioneNon devo pensare alla gestione dello statoConsApproccio (forse) non «naturale» (?!?!?!)Lo usiamo, ma non sappiamo che lo stiamo facendo
11. Domain Specific LanguagesTra i linguaggi «dichiarativi» (cioè quelli che implementano un paradigma di programmazione «dichiarativo») troviamo i Domain Specific LanguagesNe usiamo ogni giornoHTMLDescriviamo cosa vogliamo vedereNon descriviamo COME faremo a rappresentarlo (non disegnamo linee, lettere, colori)SQLNella selezione (SELECT) descriviamo i vincoli sui dati che vogliamo ottenere,Non descriviamo COME estrarre i dati da un database (generazione dell’execution plan)
12. Programmazione FunzionaleDa Wikipediahttp://en.wikipedia.org/wiki/Functional_programming«...la computazione viene espressa in termini di funzioni ed evita l’uso di stato e dati mutabili...»Nella programmazione funzionale...Le funzioni sono First-Class Types (High Order Functions)Inferenza dei tipiImmutabilitàLa scelta di essere «mutabile» (ed essere a rischio di «side effectes», è esplicita)Evita l’uso di stato per evitare insidiosi «side-effects»Specie in concurrent programmingEnfatizza la forma dei dati, non l’implementazioneUso di dati polimorfici e di pattern matchingModellato sul lambda calcoloExpression OrientedPromuove la «lazy evaluation»Valutazione «pigra», il più tardi possibile (non «eager», «impaziente», «anticipato»)Riduce l’enfasi sull’approccio imperativoPreferisce la ricorsione all’iterazioneInnalza il livello di astrazione
13. Programmazione FunzionaleNella programmazione funzionale, i concetti principali sono:I valori e la loro immutabilità«Non ci sono variabili»Il lambda calcoloProsMigliore astrazione«... l'aumento delle prestazioni dei calcolatori ha tuttavia spostato l'attenzione della comunità informatica sullo sviluppo rapido del software, sulla sua correttezza e manutenibilità...»ConsApproccio (forse) non «naturale» (?!?!?!)Lo usiamo, ma non sappiamo che lo stiamo facendo
14. Cos’è F#È un linguaggio funzionaleDeriva la sua sintassi dal linguaggio OcamlÈ il suo obiettivo principaleÈ un linguaggio imperativoSe non si può fare altrimentiÈ un linguaggio OOPPerchè deve essere interoperabile con .NETLinkshttp://msdn.microsoft.com/en-us/fsharp/default.aspxhttp://research.microsoft.com/en-us/um/cambridge/projects/fsharp/http://en.wikipedia.org/wiki/F_Sharp_(programming_language)
15. F# Evolution [Source: PDC 2010 – Don Syme]Language foundations for strongly typed access to external named data and servicesF# 3.0F# 2.0Visual Studio 2010Asynchronous, Parallel, Units of Measure…Visual Studio 2008Interactive, ObjectsF# 1.0Functional, Generics (Microsoft Research)
16. StoriaIniziato nel 2002 in Microsoft Research ad opera principalmente di Don Symehttp://blogs.msdn.com/b/dsyme/http://en.wikipedia.org/wiki/Don_SymeA Don si deve anche l’implementazione dei generics nel CLR 2.0 (usati poi pesantemente in F#)A inizio 2005 viene rilasciata la prima release pubblica di F#http://blogs.msdn.com/b/dsyme/archive/2005/01/05/346857.aspxNel 2009 Somasegar annuncia l’inclusione di F# (2.0) in Visual Studio 2010http://blogs.msdn.com/b/somasegar/archive/2009/10/09/f-in-vs2010.aspxIl 4 novembre 2010 il source code di F# viene rilasciato come Open Sourcehttp://blogs.msdn.com/b/dsyme/archive/2010/11/04/announcing-the-f-compiler-library-source-code-drop.aspxSi può anche installare sotto Linux e Mac OSX con MONOhttp://fsxplat.codeplex.com/
17. Applicazioni tipiche per F#...fermo restando che F# è un General Purpose LanguageImplementa anche l’approccio imperativoAlcuni domini importantiFinancial ModelingData MiningScientific AnalisysAcademic
18. Caratteristiche di F#Shell per lo scripting interattivoOttimo per la prototipazioneConcisoType InferenceStrongly TypedAutomatic Generalization (sempre generico, se ha senso)Poca Type Annotation (attributi)First Class FunctionsCurrying, Lazy EvaluationsPattern matching
19. Scripting InterattivoUtilizzato in ambito amministrativo, matematico o Dynamic LanguagesCmd, PowerShell, Mathematica, (Iron)Python, (Iron)RubyL’utente inserisce i comandi uno alla volta, eseguendoliNormalmente, i linguaggi di scripting sono interpretatiF# è compilatoUno scripting è di successo quanto più semplice è scrivere il codiceIn F# è possibile avere la verifica (statica) dei tipi
20. L’ambiente interattivoDa riga di comando, digitare fsi.exeDa Visual Studio 2010, due opzioniCTRL+ALT+F per una console F# interactiveCreare un progetto F#, inserire un file .fsx ed eseguire «selezioni» di codice con ALT+INVIO
21. Shell interattivaIn una shell interattiva, i comandi vengono terminati con il doppio carattere ;;it è l’ultimo valore calcolatoIt non è itF# è Case Sensitive Shell Interattiva> 3+4> 3+4;;val it : int = 7>itval it : int = 7>ItScript.fsx(3,1): error FS0039: The value or constructor 'It' is not defined
24. Valori, non variabililet permette di definire valori«=» non è assegnazione, ma uguaglianza, al fine della definizioneF# applica sempre la Type Inference (a : int)Simile a var in C#......ma il feeling è quello dello scripting...a è un valore, non una variabilea è immutabile> leta=4;;val a : int = 4> leta=5;;Script.fsx(5,5): error FS0037: Duplicate definition of value 'a'
25. Valori «mutabili», allora variabililet mutable permette di definire valori mutabilia è una variabileMotto:«se proprio serve...»> letmutable a=4;;val a : int = 4> a<-a + 1;;val a : int = 5
26. Perchè «immutabile»?Perchè la seguente istruzione (es. in C#)var a = 5;è fuorviante:«=» non significa «uguaglianza», ma assegnazione«==» (uguaglianza) dipende dal momento in cui vado a leggerloè vera solo in uno o più «momenti» non determinabiliPerchè ho bisogno della «mutabilità»?Perchè ho bisogno di mantenere un valore «transiente»?Es. Per un loopMa probabilmente il loop lo si può riscrivere con una funzione ricorsiva (vedi dopo)Approccio dichiarativo (se la funzione ricorsiva deve essere implementata con un loop oppure con una tail recursion, non è un problema del programmatore, che deve dichiarare la sua necessità)La definizione della variabile è un mezzo, non è il fineL’obiettivo è sempre lo stesso: la manutenibilitàSe so scrivere del codice «funzionale», permeante del concetto di «immutabilità», allora il riferimento al simbolo «a» sarà sempre «deterministico», avrà sempre quel valore.Questo è utile soprattutto quanto diversi task (asincronia, parallelismo) insistono sugli stessi valori (non variabiliÈ un presupposto matematico: ridiamo ad «=» il suo significato originaleÈ come un «code contract», una asserzione «state is evil»!Minimizziamo i side effects
27. Tipi di dati (immutabili)ListeTupleRecordArray>letlista=[1..10];;val lista : int list = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]>let tupla = (1, "due", 3.0, false);;val tupla : int * string * float * bool = (1, "due", 3.0, false)>let a,b,c,d = tupla;;val d : bool = falseval c : float = 3.0val b : string = "due"val a : int = 1>typePerson={Name:string;Surname:string;};;type Person = {Name: string; Surname: string;}>letp={Name="Mario";Surname="Rossi"};;val p : Person = {Name = "Mario"; Surname = "Rossi";}>letvalues=[|10;20;30|]val values : int [] = [|10; 20; 30|]
28. Funzioni come valorilet permette di definire anche funzioniLe funzioni associano ad valori in ingresso dei valori in uscitaLe funzioni sono valoriLe funzioni sono elementi «first class» del linguaggio:Possono essere passate come parametriPossono essere restituite come risultatiPossono essere memorizzate in variabili e srutture dati> letfx=x+1;;val f : int -> int> f5;;val it : int = 6
29. f x si può anche scrivere come x |> fIn caso di due parametri, il parametro in pipelining è quello più a destray|>fx
30. È ottimo quando si usano applicazioni in sequenzaPipelining operator> letincrx=x+1val incr : int -> int> 10|>incrval it : int = 11>let f x y = x*2+y*3val f : int -> int -> int> 10 |> f 20val it : int = 70>let values = [1..10]let sumOfValues = values |> List.filter (fun x -> (x % 2 = 0)) |> List.map (fun x -> x*2) |> List.fold (+) 0val values : int list = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]val sumOfValues : int = 60
31. È possibile valorizzare parzialmente i parametri di una funzione componendo un nuovo valore (partial function application)Infatti notiamo che dopo una let viene sempre mostrato il formato del valoreIl meccanismo si chiama «currying»http://en.wikipedia.org/wiki/CurryingÈ una tecnica che permette di trasformare una funzione di n parametri in una «catena di funzioni di un solo parametro»Composition>letfxy=x+y>letincrx=fx1>incr5val f : int -> int -> intval incr : int -> intval it : int = 6
33. Cosa genera questo programma in F#? (che non significa niente...)leta=4letmutableb=a+5letfx=x+aletg=fbSe si usa Reflector...F# e Immutability dal punto di vista di .NET
35. Anche chiamate «option types»Simile all’ereditarietà in OOP«functional inheritance»Anche il tipo diventa un valoreSimile a una Enum???Discriminated Unions>typeVeicolo=|Auto|Moto|Camion;;>letveicolo=Auto;;val veicolo : Veicolo = Auto
36. È possibile adornare l’alternativa del tipo con degli attributiDiscriminated Union>typeNome=string>typeMarca=string>typeColore=string>typeVeicolo=|AutoofColore|MotoofMarca|CamionofNome>letveicolo=Auto("rossa")val veicolo : Veicolo = Auto "rossa"
37. La «sequenza» di informazioni di tipo e di attributi può essere usata per «discriminare» il tipoLa sequenza di tipo e di attributi è un «pattern» È uno dei meccanismi fondamentali di F#http://en.wikibooks.org/wiki/F_Sharp_Programming/Pattern_Matching_BasicsPattern MatchingtypeNome=stringtypeMarca=stringtypeColore=stringtypeVeicolo=|AutoofColore|MotoofMarca|CamionofNomeletveicolo=Auto("rossa")matchveicolowith|Auto(colore)->printfn"Un'auto%s"colore|Moto(marca)->printfn"Unamoto%s"marca|_->printfn"unveicoloqualsiasi"
38. type Expr = | Num of int | Add of Expr * Expr | Mul of Expr * Expr | Var of stringletrec Evaluate (env:Map<string,int>) exp = match exp with | Num n -> n | Add (x,y) ->Evaluateenv x + Evaluateenv y | Mul (x,y) ->Evaluateenv x * Evaluateenv y | Var id -> env.[id]let envA = Map.ofList [ "a",1 ;"b",2 ;"c",3 ]let expT1 = Add(Var "a",Mul(Num 2,Var "b"))let resT1 = Evaluate envA expT1Un esempio notevole di pattern matchingtype Expr = | Num of int | Add of Expr * Expr | Mul of Expr * Expr | Var of stringval Evaluate : Map<string,int> -> Expr -> intval envA : Map<string,int> = map [("a", 1); ("b", 2); ("c", 3)]val expT1 : Expr = Add (Var "a",Mul (Num 2,Var "b"))val resT1 : int = 5
39. Osservare cosa F# ha generato a fronte del codice scritto prima, descrive molto bene il concetto di «declarative programming» detto all’inizioClassi già implementate (e spesso lo si faceva a mano)Uso estensivo di: IEquatable
41. IComparableSono i concetti trovati negli «anonymous types» in C# 3.0In C# lo si poteva fare, ma non siamo mai stati realmente abituati a farloDiscriminated Union, Pattern Matching e Reflector
42. Una funziona viene dichiarata ricorsiva con la parola chiave recÈ l’equivalente funzionale dell’iterazioneSi ha spesso paura di usare le funzioni ricorsive per le prestazioni e il «consumo» dello stackRicorsione> letrecfactorial=function|0|1->1|n->n*factorial(n-1)> factorial 10val it : int = 3628800
43. Tail RecursionTail Call Optimization è unacaratteristica del compilatoreF# (e in alcunicasianche del JITer .NET) chetrasformaunafunzionericorsiva in un ciclo while se la chiamataricorsiva è l’ultima.Questa ottimizzazionerisolveilproblemadello stack overflowBisognasempretentare di pensare ad unafunzioneaffinchèsia “tail optimizable”Perchèilcompilatore (o ilJITer) non fannotutto da soloIl TCO è disponibilenel CLR 4.0Quindianche in C#!Il codice che è applicabile a più tipi, viene automaticament generalizzatoÈ interessante notare come il codice generato dipenda fortemente da funzioni standard di libreriaAutomatic Generalization>letmaxab=ifa>bthenaelsebval max : 'a -> 'a -> 'a when 'a : comparison
45. È un estensione al Type system extensionNon è invasivoÈ un meccanismo di annotazione basato sul processo di inferenzaNon ha costo a runtimeAttenzione!È una prima versione
47. Ma è già un gran bel lavoroUnità di Misura>[<Measure>]typem;;[<Measure>]type m>[<Measure>]types;;[<Measure>]type s>letspace=10.0<m>;;val space : float<m> = 10.0>lettime=2.0<s>;;val time : float<s> = 2.0>letspeed=space/time;;val speed : float<m/s> = 5.0>letacc=space/time/time;;valacc : float<m/s ^ 2> = 2.5
48. Computational WorkflowSono un concetto complicatoPermette di definire un DSLF# mette a disposizione delle parole chiave, integrate nel linguaggio (let, let!, use, use!, do, do!, for, while if, yield, yield!, return, return!)
49. «Mappa» queste parole chiave sui metodi di una classe «builder» (Let, Bind, Using, For, While, if, Combine, Yield, YieldFrom, Return, ReturnFrom)
51. Quindi un «workflow» scritto con quelle parole chiave viene eseguito come sequenza di metodi dell’oggetto builder, di cui noi abbiamo pienamente il controlloÈ un approccio AOP (Aspect Oriented Programming)http://en.wikipedia.org/wiki/Aspect-oriented_programmingI metodi (Let, Bind, ....) «osservano» l’esecuzione del programma e agiscono in background
52. Ad esempio per un logging...let bind value1 function1 = printfn "Bind %A." value1 function1 value1let result value1 = printfn "Returning result: %A" value1fun () -> value1let delay function1 =fun () -> function1()type TraceBuilder() =member x.Bind(value1, function1) = bind value1 function1member x.Return(value1) = result value1member x.Delay(function1) = printfn "Starting traced execution." delay function1let trace = new TraceBuilder()let trace1 = trace {let! x = 7let! y = 5let! sum = x + yreturn sum }trace1()Tracing Workflow>val bind : 'a -> ('a -> 'b) -> 'bval result : 'a -> (unit -> 'a)val delay : (unit -> 'a) -> unit -> 'atype TraceBuilder = class new : unit -> TraceBuilder member Bind : value1:'c * function1:('c -> 'd) -> 'd member Delay : function1:(unit -> 'a) -> (unit -> 'a) member Return : value1:'b -> (unit -> 'b) endval trace : TraceBuilderStarting traced execution.val trace1 : (unit -> unit -> int)Bind 7.Bind 5.Bind 12.Returning result: 12val it : (unit -> int) = <fun:result@40>
54. Perchè apprendere l’approccio funzionaleMaggiore controllo del codiceMinimizzare lo stato (mutable)Esaltal’immutabilitàdeidatiOrganizzare il codiceApplicazione di Pattern
55. Vale la pena imparare F#?Tutto ciò che si può fare in C# lo si può fare in F# (almeno, al momento, mi pare…)È multiparadigma (supporta l’approccio imperativo)Esalta l’immutabilità dei dati e la valutazione di espressioni (sembra tutto LINQ!)È interoperabile con .NETAlcune cose sono più sempliciApplicare i design patternsSintassi più succintaTask asincroni (workflow)Operazioni di trasformazioneComputazioniDomain Specific LanguagesAspect Oriented ProgrammingAlcune cose sono più complicateGUI programmingC’è già un sacco di codice F# in Internet da riusare
56. Considerazione sulle Prestazioni«Minime», sorry!Cons:Approccio dichiarativoCode GenerationÈ un codice efficace?Pros:Sintassi funzionale nativa, non syntactic sugar, no delegates (non sono tutte lambda expressions)Immutability: minimo numero di oggetti da collezionare da parte del GC
57. Libri & BlogBeginning F#Robert Pickering - APresshttp://www.amazon.com/Beginning-F-Robert-Pickering/dp/1430223898/ref=sr_1_1?ie=UTF8&s=books&qid=1290127128&sr=8-1-spellBlog: http://strangelights.com/blog/Expert F# 2.0Don Syme, Adam Granicz, Antonio Cisternino - APresshttp://www.amazon.com/Expert-2-0-Experts-Voice-Syme/dp/1430224312/ref=pd_sim_b_3Blog: http://blogs.msdn.com/b/dsyme/Programming F#Chris Smith - O’Reillyhttp://www.amazon.com/Programming-comprehensive-writing-complex-problems/dp/0596153643/ref=pd_bxgy_b_img_bBlog: http://blogs.msdn.com/b/chrsmith/Real World Functional Programming: With Examples in F# and C#Tomas Petricek – Manninghttp://www.amazon.com/Real-World-Functional-Programming-Examples/dp/1933988924/ref=pd_bxgy_b_img_bBlog: http://tomasp.net/Professional F#Ted Neward, Aaron Erickson, Talbott Crowll, Rick Minerich – Wroxhttp://www.amazon.com/Professional-F-2-0-Ted-Neward/dp/047052801X/ref=sr_1_1?ie=UTF8&s=books&qid=1290127457&sr=1-1Blog: http://blogs.tedneward.com/F Sharp Programminghttp://en.wikibooks.org/wiki/F_Sharp_Programming