Függvényminták

Befejeződött

Eddig ismétlődő kifejezéseket vett fel, és ezeket a kifejezéseket függvényekbe helyezte. A kód most már jobban néz ki, és könnyebben olvasható. Ahogy egyre jobban hozzászokik a függvények használatához, érdemes elkezdeni néhány hatékony mintát, amelyek ebben a térben léteznek. Ezen minták használatával könnyebben olvasható és karbantartható kódot kap.

Deklaratív és imperatív

Amikor elkezdi a kódolást, valószínűleg egy kifejezést ír. Ezután megír egy másik kifejezést, majd egy másikat, egymás után. A fókusz a probléma megoldásán van, és ön pontosan tudja, hogyan oldja meg. Ezt a megközelítést imperatív megközelítésnek nevezzük. Semmi baj nincs vele, mert megoldja a problémát. De van egy másik út is, amely a deklaratív megközelítés. Egy deklaratív megközelítésre láthat példát, amikor sql használatával kérdez le egy adatbázist.

Íme egy példakifejezés:

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

Mi teszi ezt a kódot deklaratívvá, hogy megkérdezi , mit szeretne, de nem adja meg, hogyan szeretné megoldani a problémát. Hagyja, hogy az SQL kezelje a hogyan részét.

Ezt a megközelítést az F#-ra is alkalmazhatja. A következő kód deklaratív megközelítést használ:

let studentsFromOhio = 
    allStudents  
    |> filterLocation "Ohio"

Az előző kódban az adatokon dolgozik, és anélkül kérdezi meg, hogy mit szeretne, anélkül, hogy konkrétan meghatározta volna, hogyan szeretné elvégezni. Ha a kód az előző példához hasonlóan néz ki, könnyen olvasható és értelmezhető. Ehhez a ponthoz tekintsünk meg néhány hasznos mintát, amelyek támogatottak az F#-ban.

Funkcionális minták

Az F#-ban néhány hasznos minta használható a funkcionálisabb megközelítésre. A következő mintákat mutatjuk be:

  • Összetétel: Egy összetétel több függvényt egyesít egy függvényben.
  • Folyamat: Egy folyamat egy értékkel kezdődik, majd egymás után több függvényt hív meg úgy, hogy az egyik függvény kimenetét használja a következő függvény bemeneteként.

Összeállítás

A kompozíció a függvények egyesítéséről és alkalmazásáról szól, egymás után, egy bizonyos sorrendben. A kompozíciós operátor két függvényt vesz fel, és egy új függvényt ad vissza.

Amikor kódot készít, gyakran talál magának egy függvényt, majd egy másik függvényt közvetlenül utána. Előfordulhat például, hogy egy listát szeretne rendelni, és kiszűrni az összes kedvezményben lévő terméket.

Az alábbi példában a függvény add2() neve és eredménye a függvényhez multiply3() lesz etetve.

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

Ez a minta annyira gyakori, hogy az F# operátorral rendelkezik. Az >> operátor segítségével két vagy több függvényt egyesíthet egy nagyobb függvénnyel. Az operátor használatával >> egyszerűsítheti az előző kódot, például:

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

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

A kombinált függvény addAndMultiply() balról jobbra alkalmazza azokat a függvényeket, amelyekből áll. Ebben a példában először történik, add2() és multiply3() utoljára történik.

Pipeline

A folyamat operátora |> függvényt és argumentumot használ, és egy értéket ad vissza. Lássuk, miben különbözik a folyamat az összeállítástól az alábbi példával:

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

Az utolsó kódsorban az egész számok listájával kezdődik, listamely az első függvény sort()bemeneteként szolgál. Ennek a műveletnek az eredménye be lesz etetve a következőbe print(): . A folyamat és az összetétel közötti fő különbség az, hogy egy folyamat esetében néhány adattal kell kezdenie, amely ebben az esetben az egész számok listája, majd egy függvénykészleten vezeti végig.