33 votes

Snippets élégant de F #

Je suis actuellement en apprentissage F# assez intensivement. J'ai vraiment l'amour c'est comme une langue, c'est juste "sent" la droite et semble pour vous permettre de produire certains succinct code élégant.

Je suis intéressé à trouver vraiment sympa "facteur wow' snippets de code F# qui démontrant la elegence de la langue, surtout par rapport à C#. Par exemple j'aime vraiment:-

#light
laissez ListProduct l = Liste.fold_left (*) 1 l

Qui les entrées d'une liste d'entiers et multiplie chaque élément dans la liste, c'est à dire obtient le produit de la liste (par exemple, une liste de 1,2,3 serait calculé de la 1*2*3=6). Le plus proche de C# équivalent, à l'aide de LINQ et les concepts de fonctions est comme suit:-

using System;
using System.Collections.Generic;
using System.Linq;

...

public static class ListHelper {
  public static int ListProduct(List<int> l) {
    return l.Aggregate(1, (i, j) => i * j);
  }
}    

Avant de LINQ qui aurait été:-

using System;
using System.Collections.Generic;

...

public static class ListHelper {
  public static int ListProduct(List<int> l) {
    int ret = 1;
    foreach (int i in l) ret *= i;
    return ret;
  }
}

Je suis certainement pas en train de critiquer C# ici, je pense que c'est une langue merveilleuse, c'est juste agréable de voir comment F# compare et de voir comment il peut faire des choses en plus élégamment quelqu'un aurait-il quelque chose de vraiment agréable?

23voto

Chris Smith Points 7465

Mon favori liste récursivement tous les fichiers d'un dossier dans une expression de séquence de quatre lignes:

 open System.IO

let rec filesUnderFolder basePath =
    seq {
        for file in Directory.GetFiles(basePath) do
            yield file
        for subDir in Directory.GetDirectories(basePath) do
            yield! filesUnderFolder subDir
        }
 

16voto

ninegrid Points 778

En dépit de la forte prévalence de la négativité entourant Fibonacci exemples. Je suis plutôt comme eux. Il s'avère que la "pratique" de la programmation est souvent une composition de nombreux "irréalisable"-regard sur les choses. Le Fibonacci exemple nous montre ce qu'un doublement récurrente déclaration peut ressembler. Haskell est particulièrement élégante solution qui peut nous apprendre quelque chose sur F#:

fibonacci = 0 : 1 : zipWith (+) fibonacci (tail fibonacci)

Tout d'abord, l'étude de cet extrait et l'obtenir. bobards se définit en fonction d'elle-même paresseusement. Nous pouvons obtenir quelques paresseux de F# à l'aide de séquences. À l'aide de FSI, voici comment:


> let fibonacci = Seq.unfold (fun (x, y) -> Some(x, (y, x + y))) (0I,1I);;

val de fibonacci : seq


> #time;;

--> Calendrier de maintenant


> fibonacci |> Seq.nth 10000;;

Réel: 00:00:00.027, CPU: 00:00:00.031, GC gen0: 0, gen1: 0, gen2: 0

val it Système.Numerics.BigInteger =

33644764876431783266621612005107543310302148460680063906564769974680081442166662368155595513633734025582065332680836159373734790483865268263040892463056431887354544369559827491606602099884183933864652731300088830269235673613135117579297437854413752130520504347701602264758318906527890855154366159582987279682987510631200575428783453215515103870818298969791613127856265033195487140214287532698187962046936097879900350962302291026368131493195275630227837628441540360584402572114334961180023091208287046088923962328835461505776583271252546093591128203925285393434620904245248929403901706233888991085841065183173360437470737908552631764325733993712871937587746897479926305837065742830161637408969178426378624212835258112820516370298089332099905707920064367426202389783111470054074998459250360633560933883831923386783056136435351892133279732908133732642652633989763922723407882928177953580570993691049175470808931841056146322338217465637321248226383092103297701648054726243842374862411453093812206564914032751086643394517512161526545361333111314042436854805106765843493523836959653428071768775328348234345557366719731392746273629108210679280784718035329131176778924659089938635459327894523777674406192240337638674004021330343297496902028328145933418826817683893072003634795623117103101291953169794607632737589253530772552375943788434504067715555779056450443016640119462580972216729758615026968443146952034614932291105970676243268515992834709891284706740862008587135016260312071903172086094081298321581077282076353186624611278245537208532365305775956430072517744315051539600905168603220349163222640885248852433158051534849622434848299380905070483482449327453732624567755879089187190803662058009594743150052402532709746995318770724376825907419939632265984147498193609285223945039707165443156421328157688908058783183404917434556270520223564846495196112460268313970975069382648706613264507665074611512677522748621598642530711298441182622661057163515069260029861704945425047491378115154139941550671256271197133252763631939606902895650288268608362241082050562430701794976171121233066073310059947366875

{IsEven = false; IsOne = false; IsPowerOfTwo = false; IsZero = false; Signe = 1;}


C'est gentil. Même pour ma modeste poste de travail. C'est pratique, parce que nous avons défini quelque chose d'élégant, dans une ligne qui surpasse naïf multi-ligne implémentations. Nous avons exploité les quelques concepts pratiques pendant que nous y sommes. Nourrissage (comme démontré par le pipeline de la Seq.nième), lazy evaluation (tel que démontré par Seq.déplier), et les lambdas (la fonction anonyme donnée à Seq.déplier). Nous avons aussi profité de la "forme" de la suite de Fibonacci calcul pas tout à fait de la même manière que le Haskell version, mais assez similaire.

5voto

Brian Points 82719

Pour l'élégance F #, consultez la série YAPES de Dustin: http://diditwith.net/2008/04/24/YetAnProProElerSeriesYAPES.aspx

4voto

3voto

Brian R. Bondy Points 141769

F# est un langage de programmation fonctionnel et est donc idéal avec des listes et la récursivité.

Le code ci-dessous, une légère modification à la partie de la valeur par défaut tutoriel F# Projet inclus avec le F# package de téléchargement. Il n'est rien de spécial, mais il montre le même code que vous avez mis au-dessus, pour ceux qui se demandent.

let rec ListProduct xs =
    match xs with
    //If xs is an empty list, we have a match with an empty list.  Return 1
    | []    -> 1
    //Otherwise match with an item + the rest of the list.  
    //Return the first item * the rest of the list. 
    | y::ys -> y * ListProduct ys

Ce code n'est évidemment pas pour but de donner tout facteur wow comme vous l'avez mentionné. Mais vous pouvez voir certains vraiment cool utilisations de F# sur ce site. Découvrez le solveur de sudoku en F#. Comparer ce code pour un C# de la mise en œuvre d'un solveur de Sudoku. Le site montre également comment coder facilement une interface graphique de F#.

Ce site va vous montrer comment intégrer F# avec ASP .Net

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X