Prozkoumání funkcí

Dokončeno

Obvykle se nacházíte v situaci, kdy se váš kód opakuje. Dělá to samé na mnoha místech, nebo existují jen menší rozdíly. V takových situacích se zamyslete nad tím, jak vytvořit opakovaně použitelný kód. Způsob, jak tuto situaci vyřešit, je extrahovat tyto výrazy a vytvořit jednu nebo více funkcí. Funkce je základním stavebním blokem v mnoha programovacích jazycích a jazyk F# se nijak neliší.

Funkce A

Funkce je pojmenovaný odkaz s tělem, který se skládá z jednoho nebo více výrazů. Může mít také parametry. Funkce začíná klíčovým slovem let a názvem funkce. Dále je operátor přiřazení a napravo od tohoto operátoru je tělo funkce.

Tady je syntaxe funkce:

let <function name> <parameters> = <function body>

Skutečný příklad funkce, jak je znázorněno s předchozí ukázkovou syntaxí, vypadá takto:

let add a b = a + b 

V tomto příkladu je add název funkce a parametry jsou a a b. Tělo funkce sčítá dva parametry a+bdohromady a vrátí výsledek.

Vrácené hodnoty

Jak jste viděli v prvním příkladu, neexistuje žádné return klíčové slovo, které by uvedlo, co se vrací. V jazyce F# se informace na posledním řádku funkce vrátí. Zvažte tuto víceřádkovou funkci:

let addAndMultiply a b c = 
    let sum = a + b
    let product = sum * c
    product

product Umístěním na poslední řádek se dozvíte, co se vrátí. Jak tedy zavoláte funkci, jako je tato?

Volání funkce

Pokud chcete volat nebo vyvolat funkci, použijte název funkce a přidejte všechny parametry, které chcete použít, oddělené znakem mezery. Pokud chcete například volat addAndMultiply() funkci, zadejte následující kód:

addAndMultiply 2 3 3 // 15

Pokud chcete zobrazit výsledky funkce, můžete ji buď přiřadit k proměnné, nebo ji vytisknout přímo, například takto:

let sum = addAndMultiply 2 3 3
printfn "%i" sum
// OR
printfn "%i" (addAndMultiply 2 3 3)

Odvozené typy

Pojďme se podívat na následující kód:

let add a b = a + b
let sum = add 2 2 
let concat = add "hello" "world" // will give compilation error

Tento kód selže na posledním řádku s následující zprávou:

error FS0001: This expression was expected to have type
    'int'    
but here has type
    'string'    

Důvodem selhání je, že jazyk F# už určil, jaký typ parametru se má použít, a rozhodl se pro celé číslo. Důvod, proč se rozhodl pro celé číslo, bylo způsobeno informacemi ve druhém řádku, let sum = add 2 2. Funkce add() byla použita způsobem, který uvedl, že typ parametru byl rozhodně celé číslo.

Pokud druhý řádek neexistuje, váš kód funguje:

let add a b = a + b
// let sum = add 2 2 
let concat = add "hello" "world" // will work

Kompilátor zjistí, že první použití funkce je provedeno s řetězci a dospěl k závěru, že typ parametru je řetězec. Proto kontext a první použití odvodí typ.

Explicitní typy

Existují situace, kdy chcete být explicitní, a to jak o typu parametrů, které se mají vzít, tak o tom, jaký typ funkce vrátí. Pomáhá určitou čitelnost, i když ho kompilátor s největší pravděpodobností nepotřebuje.

Použijte například následující funkci:

let convert a =
    int a

Pokud chcete do něj přidat typy, přidejte :<type>například:

let convert (a:string) =
    int a

Parametr má nyní typ string prostřednictvím kódu let convert (a:string). Teď můžete být explicitnější přidáním návratového typu. Uděláte to tak, že hned za parametr přidáte další :<type> :

let convert (a:string) :int =
    int a

Nyní závorky ohraničují parametr, jak je znázorněno v (a:string). Návratový typ je poslední :<type> poznámka, která se má stát, což je :int. Jazyk F# je dostatečně chytrý, aby zjistil většinu scénářů, ale někdy potřebujete pomoct s kódem tím, že je explicitnější. Další výhodou přidávání typů je, že usnadňuje dalšímu vývojáři zjistit, co se děje.