Функции

Последнее обновление: 10.12.2023

Основным строительным блоком программы на языке F# являются функции. Функции определяют действия, которые совершает программа.

Каждая функция в F# имеет название и тело, то есть выполняемые действия. Общее определение функции:

let имя_функции параметры = действия_функции

По сути функция также представляет значение, и ее определение начинается с оператора let, за которым идет название функции. Далее идет перечисление параметров через заятую. И затем через знак равно (=) указываются выполняемые функцией действия. Например, определим простейшую функцию, которая выводит на консоль сообщение:

let printMessage() = printfn "Hello world"

Эта функция называется printMessage. Она принимает один параметр - значение типа unit, которое представляет пустые скобки (). По сути использование пустых скобок (значения типа unit) предполагает, что нам не важны параметры.

Тело функции - printfn "Helo world". Для вывода на консоль кстати применяется еще одна функция - printfn, после которой указывается выводимое на консоль сообщение.

Определив функцию, мы можем ее вызвать, то есть выполнить ее действия. Для этого достаточно просто указать имя функции, после которого указываются значения ее параметров:

название_функции значения_для_параметров

Например, выполним выше определенную функцию printMessage:

let printMessage() = printfn "Hello world"		// определение функции

printMessage()		// вызов функции

Поскольку для этой функции указан один параметр - типа unit, то при вызове мы должны передать функции значение типа unit - то есть пустые скобки: printMessage().

В итоге при выполнении этой функции на консоль будет выведена строка "Hello world"

Преимуществом функций является то, что мы можем вызывать функцию многократно в различных частях программы:

let printMessage() = printfn "Hello world"

printMessage()
printMessage()
printMessage()

Консольный вывод данной программы:

Hello world
Hello world
Hello world

В данном случае тело функции состоит из одного действия. Если функция должна выполнить несколько действий, то они последовательно располагаются на последующих строках:

let printMessage() =                      // начало определения функции   
    printfn "Welcome to F#"
    let message = "Hello METANIT.COM"
    printfn "%s" message                 // конец определения функции

printMessage()    // вызов функции  
printMessage()    // вызов функции  

Здесь тело функции printMessage() состоит из трех действий. Первое выводит на консоль некоторе сообшение:

printfn "Welcome to F#"

Затем определяем значение, которое хранит строку:

let message = "Hello METANIT.COM"

В конце функции выводим это значение на консоль:

printfn "%s" message 

После определения функции она вызывается два раза, поэтому при выполнении программы мы увидим на консоли:

Welcome to F#
Hello METANIT.COM
Welcome to F#
Hello METANIT.COM

Обратите внимание, что при определении многострочной функции каждое ее действие предваряется отступом. При этом в качестве отступа может использоваться табуляция или пробел, главное, чтобы были отступы. Благодаря этому компилятор сможет установить границы функции и отделить ее от прочих выражений, которые не входят в функцию. Например, изменим предыдущий пример следующим образом:

let printMessage() =                      // начало определения функции   
    printfn "Welcome to F#"               // конец определения функции
let message = "Hello METANIT.COM"
printfn "%s" message                 

printMessage()    // вызов функции  
printMessage()    // вызов функции 

Теперь функция состоит только из одного действия - printfn "Welcome to F#", поскольку на последующих строках не применяются отступы.

Поэтому консольный вывод будет другим:

Hello METANIT.COM
Welcome to F#
Welcome to F#

Функция или значение

Выше мы определили функцию printMessage(), которая фактически не принимает никаких параметров (формально же имеет один параметр - значение unit). Но тут надо отметить следующую деталь. Интутивно при определении функции без параметров начинающие иногда пишут что-то вроде следующего:

let printMessage = printfn "Welcome to F#"             

printMessage 
printMessage

В отличие от предыдущего примера здесь не указан параметр типа unit. И после определения мы пытаемся вызывать два разу опреленную "функцию". Однако мы получим следующий консольный вывод:

Welcome to F#

Мы видим, что строка выводится только один раз. Более того мы можем вообще убрать из кода две последние строки и оставить только первую

let printMessage = printfn "Welcome to F#"

И мы получим тот же консольный вывод.

Дело в том, что это НЕ определение функции, это определение значения, при определении которого срабатывает функция printfn. Поэтому следует отличать простое значение

let printMessage = printfn "Welcome to F#"

от функции

let printMessage() = printfn "Welcome to F#"
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850