Eksplorowanie funkcji

Ukończone

Zazwyczaj znajdujesz się w sytuacji, w której kod wygląda powtarzalnie. Robi to samo w wielu miejscach lub istnieją tylko drobne różnice. W takich sytuacjach pomyśl o sposobie ponownego wykorzystania kodu. Sposobem rozwiązania tej sytuacji jest wyodrębnienie tych wyrażeń i utworzenie jednej lub więcej funkcji. Funkcja jest podstawowym blokiem konstrukcyjnym w wielu językach programowania, a język F# nie różni się.

Funkcja

Funkcja jest nazwanym odwołaniem z treścią składającą się z co najmniej jednego wyrażenia. Może również mieć parametry. Funkcja rozpoczyna się od słowa kluczowego let i nazwy funkcji. Następnie jest operator przypisania, a po prawej stronie tego operatora jest treść funkcji.

Oto składnia funkcji:

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

Rzeczywisty przykład funkcji, jak pokazano w poprzedniej przykładowej składni, wygląda następująco:

let add a b = a + b 

W tym przykładzie nazwa funkcji to add , a parametry to a i b. Treść funkcji dodaje dwa parametry razem , a+bi zwraca wynik.

Wartości zwracane

Jak widzieliście w pierwszym przykładzie, nie ma return słowa kluczowego do wskazania, co jest zwracane. W języku F# informacje w ostatnim wierszu funkcji są zwracane. Rozważmy tę funkcję wielowierszową:

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

Umieszczając product w ostatnim wierszu, pokazuje, co jest zwracane. Jak więc wywołać funkcję podobną do tej?

Wywoływanie funkcji

Aby wywołać funkcję, użyj jej nazwy i dodaj wszystkie parametry, których chcesz użyć, oddzielając je spacją. Aby na przykład wywołać addAndMultiply() funkcję, wprowadź następujący kod:

addAndMultiply 2 3 3 // 15

Aby wyświetlić wyniki funkcji, możesz przypisać ją do zmiennej lub wydrukować ją bezpośrednio, w następujący sposób:

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

Wnioskowane typy

Weźmy następujący kod:

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

Ten kod kończy się niepowodzeniem w ostatnim wierszu z następującym komunikatem:

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

Przyczyną niepowodzenia jest to, że język F# już ustalił, jakiego typu parametru należy użyć, i zdecydował się na liczbę całkowitą. Powodem, dla którego zdecydowano się na liczbę całkowitą, były informacje w drugim wierszu let sum = add 2 2. Funkcja add() została użyta w sposób, który stwierdził, że typ parametru był zdecydowanie liczbą całkowitą.

Jeśli drugi wiersz nie istnieje, kod działa:

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

Kompilator widzi, że pierwsze użycie funkcji jest wykonywane z ciągami i stwierdza, że typ parametru jest ciągiem. Tak więc kontekst i pierwsze użycie pozwalają wywnioskować typ.

Typy jawne

Istnieją sytuacje, w których chcesz być jawny w kwestii zarówno tego, jaki typ parametrów przyjąć, jak i tego, co zwraca funkcja. Ułatwia to czytelność, będąc skonkretyzowanym, nawet jeśli kompilator najprawdopodobniej tego nie potrzebuje.

Weź na przykład następującą funkcję:

let convert a =
    int a

Aby dodać do niego typy, należy dodać :<type> element w następujący sposób:

let convert (a:string) =
    int a

Parametr ma teraz typ string za pomocą kodu let convert (a:string). Teraz możesz być jeszcze bardziej precyzyjny, przez dodanie typu zwracanego. W tym celu dodaj kolejny parametr :<type> bezpośrednio po parametrze:

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

Teraz nawiasy otaczają parametr, jak pokazano w (a:string). Zwracany typ to ostatnia :<type> adnotacja, która ma się zdarzyć, czyli :int. Język F# jest wystarczająco sprytny, aby ustalić większość scenariuszy, ale czasami trzeba pomóc kodowi, będąc bardziej wyraźnym. Kolejną zaletą dodawania typów jest to, że ułatwia innym deweloperom ustalenie, co się dzieje.