Modèles de fonction

Effectué

Jusqu’à présent, vous avez pris des expressions répétitives et les avez placées dans des fonctions. Désormais, votre code a un meilleur aspect et est plus facile à lire. À mesure que vous vous habituez à utiliser davantage les fonctions, il est intéressant de commencer à examiner certains modèles puissants qui existent dans cet espace. En utilisant ces modèles, vous obtenez du code plus facile à lire et à maintenir.

Approches déclarative et impérative

Quand vous vous mettez à coder, vous commencez généralement par écrire une expression. Vous en écrivez une autre, puis une autre, et ainsi de suite. Votre priorité est de résoudre le problème, et vous voulez le faire de manière précise. Cette approche est appelée approche impérative . Il n’y a pas de mal à cela, car cette approche permet de résoudre le problème en question. Mais il y a une autre voie à suivre, c’est-à-dire l’approche déclarative . Un exemple d’approche déclarative est lorsque vous interrogez une base de données à l’aide de SQL.

Voici un exemple d’expression :

SELECT * 
FROM Students s
WHERE s.Location = "Ohio" 

Ce qui rend ce code déclaratif est que vous demandez ce que vous voulez, mais que vous ne spécifiez pas la façon dont vous souhaitez résoudre le problème. Vous laissez le soin à SQL de déterminer le comment.

Vous pouvez aussi appliquer cette approche à F#. Le code suivant suit une approche déclarative :

let studentsFromOhio = 
    allStudents  
    |> filterLocation "Ohio"

Dans le code précédent, vous agissez sur des données et vous demandez ce que vous voulez sans indiquer spécifiquement comment l’obtenir. Quand votre code se présente comme l’exemple précédent, il est facile à lire et à comprendre. Pour en arriver là, nous allons examiner certains modèles utiles pris en charge en F#.

Modèles fonctionnels

Il existe des modèles utiles en F# que vous pouvez utiliser pour adopter une approche plus fonctionnelle . Nous allons nous intéresser aux modèles suivants :

  • Composition : une composition combine plusieurs fonctions en une seule fonction.
  • Pipeline : un pipeline commence par une valeur, puis appelle séquentiellement plusieurs fonctions à l’aide de la sortie d’une fonction comme entrée pour la fonction suivante.

Composition

Une composition consiste à combiner des fonctions et à les appliquer l’une après l’autre, dans un certain ordre. L’opérateur de composition prend deux fonctions et retourne une nouvelle fonction.

Quand vous créerez du code, vous vous retrouverez souvent à appeler une fonction, puis une autre juste après. Par exemple, vous voulez classer une liste et filtrer tous les produits en promotion.

Dans l’exemple suivant, la fonction add2() est appelée et son résultat est passé à la fonction multiply3().

let add2 a = a + 2
let multiply3 a = a * 3 
let addAndMultiply a =
    let sum = add2 a
    let product = multiply3 sum
    product

printfn "%i" (addAndMultiply 2) // 12

Ce modèle est si courant que F# a un opérateur pour celui-ci. L’opérateur >> vous permet de combiner deux fonctions ou plus dans une fonction plus grande. En utilisant l’opérateur >>, vous pouvez simplifier le code précédent, comme ceci :

let add2 a = a + 2
let multiply3 a = a * 3 
let addAndMultiply = add2 >> multiply3

printfn "%i" (addAndMultiply 2) // 12

La fonction combinée addAndMultiply() applique les fonctions dont elle se compose de gauche à droite. Dans cet exemple, add2() intervient en premier et multiply3() intervient en dernier.

Canalisation

L’opérateur de pipeline |> prend une fonction et un argument et retourne une valeur. Voyons en quoi le pipeline diffère de la composition avec l’exemple suivant :

let list = [4; 3; 1]
let sort (list: int list) = List.sort list
let print (list: int list)= List.iter(fun x-> printfn "item %i" x) list

list |> sort |> print // item 1 item 3 item 4

Dans la dernière ligne de code, vous commencez par une liste d’entiers, list, qui sert d’entrée à la première fonction, sort(). Le résultat de cette opération est transféré dans print(). La principale différence entre le pipeline et la composition est que dans le premier, vous partez de quelques données, en l’occurrence une liste d’entiers, puis vous les faites passer par un ensemble de fonctions.