En aquest tema, explorarem dos conceptes fonamentals en la programació funcional amb F#: el pipelining i la composició de funcions. Aquests conceptes ens permeten escriure codi més net, modular i fàcil de mantenir.

Pipelining

El pipelining és una tècnica que permet passar el resultat d'una funció com a entrada a una altra funció de manera seqüencial. En F#, això es fa utilitzant l'operador |>. Aquest operador pren el valor a la seva esquerra i l'envia com a argument a la funció a la seva dreta.

Exemple de Pipelining

let add x y = x + y
let square x = x * x

let result = 3 |> add 2 |> square
printfn "%d" result  // Sortida: 25

Explicació:

  1. 3 |> add 2 - El valor 3 es passa com a primer argument a la funció add, resultant en add 3 2, que retorna 5.
  2. 5 |> square - El resultat 5 es passa com a argument a la funció square, resultant en square 5, que retorna 25.

Avantatges del Pipelining

  • Llegibilitat: El codi és més fàcil de llegir i entendre, ja que segueix un flux seqüencial.
  • Modularitat: Les funcions es poden combinar fàcilment sense necessitat de crear variables temporals.

Composició de Funcions

La composició de funcions és una tècnica que permet combinar dues o més funcions en una sola funció. En F#, això es fa utilitzant l'operador >> per a la composició de dreta a esquerra i l'operador << per a la composició d'esquerra a dreta.

Exemple de Composició de Funcions

let add x y = x + y
let square x = x * x

let addThenSquare = add 2 >> square

let result = addThenSquare 3
printfn "%d" result  // Sortida: 25

Explicació:

  1. add 2 >> square - Crea una nova funció que primer aplica add 2 i després aplica square al resultat.
  2. addThenSquare 3 - Aplica la funció composta al valor 3, resultant en square (add 2 3), que retorna 25.

Avantatges de la Composició de Funcions

  • Reutilització: Les funcions compostes es poden reutilitzar fàcilment en diferents parts del codi.
  • Claredat: La intenció del codi és més clara, ja que es defineixen operacions complexes com a combinacions de funcions més simples.

Exercicis Pràctics

Exercici 1: Pipelining

Escriu una funció que prengui una llista de nombres enters, multipliqui cada nombre per 2, filtri els nombres parells i després sumi tots els nombres resultants.

let processNumbers numbers =
    numbers
    |> List.map (fun x -> x * 2)
    |> List.filter (fun x -> x % 2 = 0)
    |> List.sum

// Prova la funció
let numbers = [1; 2; 3; 4; 5]
let result = processNumbers numbers
printfn "%d" result  // Sortida esperada: 20

Exercici 2: Composició de Funcions

Escriu una funció composta que prengui un nombre, el multipliqui per 3, li sumi 5 i després el divideixi per 2.

let multiplyBy3 x = x * 3
let add5 x = x + 5
let divideBy2 x = x / 2

let composedFunction = multiplyBy3 >> add5 >> divideBy2

// Prova la funció
let result = composedFunction 4
printfn "%d" result  // Sortida esperada: 8

Resum

En aquest tema, hem après sobre el pipelining i la composició de funcions en F#. Hem vist com utilitzar l'operador |> per passar el resultat d'una funció a una altra i com utilitzar els operadors >> i << per combinar funcions. Aquests conceptes són fonamentals per escriure codi funcional net i modular. Hem practicat aquests conceptes amb exemples i exercicis pràctics per reforçar l'aprenentatge.

© Copyright 2024. Tots els drets reservats