66 votes

Pratique F# extraits

Il y a déjà deux questions à propos de F#/fonctionnelle des extraits.

Cependant, ce que je cherche ici sont utiles extraits, peu 'helper' fonctions qui sont réutilisables. Ou obscur mais astucieux des modèles que vous ne pouvez jamais me rappeler.

Quelque chose comme:

open System.IO

let rec visitor dir filter= 
    seq { yield! Directory.GetFiles(dir, filter)
          for subdir in Directory.GetDirectories(dir) do 
              yield! visitor subdir filter} 

Je voudrais faire une sorte de pratique de page de référence. En tant que tel il n'y aura pas de bonne réponse, mais j'espère que beaucoup de ceux qui sont bons.

EDIT Tomas Petricek a créé un site spécialement pour les F# extraits http://fssnip.net/.

27voto

Juliet Points 40758

De style Perl regex correspondant

let (=~) input pattern =
    System.Text.RegularExpressions.Regex.IsMatch(input, pattern)

Il vous permet d'adapter le texte à l'aide de let test = "monkey" =~ "monk.+" de la notation.

27voto

Kevin Won Points 3697

Opérateur Infixe

J'ai obtenu ce à partir de http://sandersn.com/blog//index.php/2009/10/22/infix-function-trick-for-f allez à cette page pour plus de détails.

Si vous connaissez Haskell, vous pourriez vous retrouver manquant infix de sucre en F#:

// standard Haskell call has function first, then args just like F#. So obviously
// here there is a function that takes two strings: string -> string -> string 
startsWith "kevin" "k"

//Haskell infix operator via backQuotes. Sometimes makes a function read better.
"kevin" `startsWith` "K" 

Alors F# ne pas avoir un "vrai" infixe "opérateur, la même chose peut être accompli presque avec autant d'élégance via un pipeline et d'un "backpipeline" (qui savait une chose pareille??)

// F# 'infix' trick via pipelines
"kevin" |> startsWith <| "K"

26voto

Joel Mueller Points 14985

Multi-Ligne De Chaînes

C'est assez trivial, mais il semble être une caractéristique de F# chaînes qui n'est pas très connu.

let sql = "select a,b,c \
           from table \
           where a = 1"

Ce produit:

val sql : string = "select a,b,c from table where a = 1"

Lorsque le compilateur F# voit un antislash suivi d'un retour chariot à l'intérieur d'une chaîne de caractères littérale, il va supprimer tout le back-slash pour le premier caractère non espace sur la ligne suivante. Cela vous permet d'avoir plusieurs lignes littéraux de chaîne de cette ligne, sans l'aide d'un tas de concaténation de chaîne.

24voto

Benjol Points 16334

Générique memoization, avec l'aimable autorisation de l'homme lui-même

let memoize f = 
  let cache = System.Collections.Generic.Dictionary<_,_>(HashIdentity.Structural)
  fun x ->
    let ok, res = cache.TryGetValue(x)
    if ok then res
    else let res = f x
         cache.[x] <- res
         res

En utilisant cela, vous pourriez faire un cache de lecteur comme suit:

let cachedReader = memoize reader

17voto

thr Points 6718

Pour la performance intensive des trucs où vous en avez besoin pour vérifier la valeur null

let inline isNull o = System.Object.ReferenceEquals(o, null)
if isNull o then ... else ...

Est d'environ 20x plus vite alors

if o = null then ... else ...

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