Prozkoumání funkcí
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.