Console application in F#: first time

Dopo circa un mese (troppo tempo!) sono riuscito a trovare il tempo necessario per scrivere l’articolo anticipato nel post precedente.
L’obbiettivo è semplice: creare un piccolo progetto console nel linguaggio F# e scoprire insieme le potenzialità che offre.

Aprendo Visual Studio 2013 ho creato un progetto “Console Application” nel linguaggio F# e subito ho notato due dettagli che meritano la nostra riflessione:

  • La versione del framework 4.5.1, ottenuta direttamente durante l’installazione di VS 2013, aggiunge diverse novità al linguaggio F# (rispetto a VB.NET e C#), tanto da meritarsi una nuova versione F# 3.1.
    Di conseguenza, se entriamo nelle proprietà del progetto, la schermata ci permette di scegliere quale runtime del linguaggio possiamo utilizzare per sviluppare la nostra applicazione.
  • Inoltre visual studio ci offre la possibilità di creare un tipo di progetto a se stante, denominato Tutorial, contenente un file ricco di esempi e di oggetti in codice F# utili per capire e soprattutto memorizzare la sintassi di questo linguaggio.

Tornando al nostro progetto, troveremo il “solito file program” che al suo interno racchiude l’entrypoint della nostra applicazione. Per chi non lo sapesse è il metodo eseguito per primo durante l’esecuzione del progetto e in F# la funzione di ingresso viene identificata con l’attributo [<EntryPoint>].
Nel nostro esempio faremo a meno di identificare l’entrypoint eseguendo il codice proceduralmente, in ordine di scrittura.

Esempio…

using System;
class Program
{
    static void Main(string[] args)
    {
         Console.WriteLine("Il risultato è: {0}",
CalcolaFattoriale(Convert.ToInt32(Console.ReadLine()))); Console.ReadLine(); } private static int CalcolaFattoriale(int _numero) { if (_numero > 0) return _numero * CalcolaFattoriale(_numero - 1); else return 1; } }

Come punto di partenza ho preso questo semplice codice C# che, sostanzialmente, dato un numero, ne calcola il fattoriale e restituisce il risultato. Naturalmente ci sono diversi modi per scrivere questa funzione e allo stesso modo la ricorsività del metodo di calcolo è utile esclusivamente a scopo dimostrativo. Inoltre, sempre per lo stesso motivo, ho cercato di tenere gli esempi più simili possibile, per evidenziare le vere differenze tra i due linguaggi.

Passiamo ora allo stesso codice scritto all’interno del nostro progetto F#

open System;

printf("Inserisci numero per calcolo fattoriale: ")

let _numero = Convert.ToInt32(Console.ReadLine())

let rec CalcoloFattoriale _numero =
    if _numero > 0 then _numero * CalcoloFattoriale (_numero-1) else 1

let res = CalcoloFattoriale _numero
printfn "Il risultato è: %A" res

let fine = Console.ReadLine()

Analizziamo ora, riga per riga questo codice.

  1. Nella prima semplicemente viene richiamato il namespace “System” come per il linguaggio C# o VB.NET rispettivamente attraverso “using” e “import”.
  2. Nella seconda inviamo alla console la stringa di testo, ma questa funzione è già stata introdotta nei primi post del blog da Mario de Ghetto.
  3. Nella terza eseguiamo un operazione di assegnazione di un valore. In verità però è molto interessante. Infatti possiamo notare quanto sia semplice far interagire oggetti di natura OOP del framework nei costrutti di F# di natura funzionale. Questo è possibile grazie alla interoperabilità intrinseca del Framework.
  4. Nella quarta riga invece avviene il cambiamento più radicale rispetto all’esempio C#. Con la parola chiave “rec”, preceduta da “let”, dichiariamo una funzione ricorsiva, ovvero in grado di richiamare se stessa. Questo permette di eseguire “calcoli ciclici” al proprio interno, restituendo ciò che ci interessa una volta soddisfatta la condizione.
    Da notare, come la possibilità di utilizzare funzioni ricorsive rende facile e veloce (in alcuni casi) la scrittura di codice rispetto che dichiarare una nuova funzione o utilizzare dei cicli for usati nella programmazione ad oggetti.
  5. Nelle ultime righe, viene chiamata la funziona ricorsiva, successivamente viene scritto il risultato nella console e infine con l’ultima si chiede alla console di aspettare l’input dell’utente prima di terminare l’esecuzione e chiudersi prematuramente.

Per concludere possiamo notare quanto sia immediato e di veloce scrittura utilizzare F# una volta afferrati i concetti base della programmazione funzionale.
Inoltre ho fatto un piccolo test, puramente indicativo, utilizzando la classe Stopwatch del namespace System.Diagnostic sulla funzione ricorsiva di F# e sulla chiamata ricorsiva di C# e, come mi aspettavo, è risultata molto più performante quella funzionale.
In questo esempio è comunque poco indicativo, infatti utilizzando dei cicli while o for nel codice C# si otterrebbero dei risultati migliori.

Nel prossimo post vorrei approfondire meglio con qualche esempio più complesso quando è effettivamente utile integrare nelle nostre applicazioni codice funzionale o meno. Vedere quando esso porti un netto miglioramento nelle prestazioni o nell’immediatezza e facilità di scrittura delle nostre applicazioni.

Un saluto, a presto
Michael

Pubblicato il 27 luglio 2015 su Novità. Aggiungi ai preferiti il collegamento . Lascia un commento.

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: