F# dans Windows Phone 7: templates de projets, et un exemple

F# est un langage fonctionnel inspiré d’OCaml qui s’intègre dans la CLR et a la bonne idée, en étant fonctionnel, d’intégrer quand même un modèle de programmation objet, et en plus, des concepts de programmation parallèle et asynchrone assez bluffants… Assurément pas un langage mainstream, clairement pas voué à remplacer C# ou VB.NET, mais néanmoins intéressant pour comprendre l’évolution des langages, et dans pas mal de scénarios notamment quand il s’agit de se connecter et de traiter “naturellement” des sources de données. Si vous trouvez que LINQ c’est cool (c’est une syntaxe fonctionnelle intégrée à C#) vous allez kiffer F#… Pour en comprendre rapidement l’élégance je vous invite à regarder cette petite vidéo de Don Syme (qui en plus d’être un génie et Principal Researcher chez Microsoft Research est très pédagogue) ou pour aller tout de suite dans le coeur technique, sa session au TechEd. Autant vous prévenir, si vous êtes adapté à la programmation objet… ça peut piquer un peu. En tous cas moi ça pique encore…

Maintenant admettons que vous voulez découvrir ce langage, voire que vous êtes déjà devenu fan de F#, et que vous voudriez en faire usage sur votre téléphone préféré: Il suffit d’utiliser les templates disponibles sur l’online gallery dans Visual Studio 2010.

Pour cela, dans le wizard de création de nouveau projet (File –> New –> Project) il faut cliquer sur “Online Templates” puis faire une recherche sur F#… et vous obtenez ça:

fsharp_wp7

Lorsque vous cliquez sor OK vous obtenez la solution suivante:

FsharpWP7Solution

Le code F# se trouve dans le fichier “AppLogic.fs”. Comme vous pouvez le voir, l’application elle même a été séparée en 2 parties: le “host” n’est là que pour charger le code de l’appli elle même: le code C# ne fait qu’instancier un nouvel objet “App” qui est déclaré dans le code F# (le contexte de l’application, qui va lui-même charger la page principale).

On peut voir dans le template comment se fait l’initialisation de cette page principale: c’est pour le moins rustique… on crée la page principale à partir du XAML, et ensuite on instancie directement les objets à afficher:

 do Application.LoadComponent(this, new System.Uri("/WindowsPhoneApp;component/MainPage.xaml", System.UriKind.Relative))

// Bind named Xaml components relevant to this page.
let appBarButton1 : ApplicationBarIconButton = this.ApplicationBar.Buttons.[0] |> unbox 
let appBarButton2 : ApplicationBarIconButton = this.ApplicationBar.Buttons.[1] |> unbox  
let results : TextBlock = this?Results

// Set the behaviour of the buttons
do appBarButton1.Click.Add(fun _ -> results.Text <- "Yes, I'm F#")
do appBarButton2.Click.Add(fun _ -> results.Text <- "F# rocks!")

A mon humble avis F# n’est pas tant fait pour ça que pour traiter les données qu’on pourrait avoir envie d’afficher dans l’application.. mais ça n’engage que moi. En tous cas ça montre qu’on peut tout faire avec F# Smile

Reste ensuite à créer votre propre code et trouver la bonne utilisation de F# dans votre application. Si vous avez un traitement mathématique ou de classement/formatage sur des gros sets de données, ça peut être très intéressant, pas tant d’un point de vue performance que d’un point de vue simplicité et lisibilité du code… pour autant que vous pratiquiez régulièrement Smile

Petit bémol, il se trouve que les helpers asynchrones dispos dans Microsoft.FSharp.Control.WebExtensions ne sont pas implémentés dans la version pour Windows Phone 7.. c’est sûrement temporaire mais c’est bien dommage, car on aurait pu alors simplifier certaines interactions avec des API webs (cf la démo de la plénière des MS Days par Mitsu Furuta (à 1h42m30s pour être précis)

Pour le plaisir de ne pas fournir qu’un template tout vide, voici un petit générateur de fractale de Mandelbrot en F# pour Windows Phone 7 de mon cru! je pense qu’on peut un peu améliorer le code, je débute encore en F#… j’attends vos suggestions, notamment pour supprimer les mutables dans la boucle de calcul!

Attention – pour profiter de F# il Visual Studio 2010 Pro et les outils F#!! Plus d’info sur https://www.fsharp.net