Изучение функций
Зачастую вы пишете код, который выглядит однотипным. Он выполняет одно и то же действие в разных местах с минимальными отличиями. В подобных ситуациях стоит подумать о том, как сделать код пригодным для повторного использования. Один из способов это сделать — извлечь соответствующие выражения и создать одну функцию или несколько. Функция — это фундаментальный структурный элемент во многих языках программирования, в том числе и в F#.
функция ;
Функция — это именованная ссылка, в теле которой содержится одно выражение или несколько. Кроме того, у нее могут быть параметры. Функция начинается с ключевого слова let и имени функции. Затем идет оператор присваивания, а справа от него — тело функции.
Вот как выглядит синтаксис функции.
let <function name> <parameters> = <function body>
А вот так пример функции, соответствующей приведенному выше примеру синтаксиса.
let add a b = a + b
В этом примере add — имя функции, а a и b — ее параметры. В теле функции два параметра складываются вместе (a+b), и возвращается результат.
Возвращаемые значения
В первом примере для объявления возвращаемого результата ключевое слово return не использовалось. В F# возвращается информация, указанная в ее последней строке функции. Рассмотрим эту многострочную функцию.
let addAndMultiply a b c =
let sum = a + b
let product = sum * c
product
Чтобы указать, что должно возвращаться значение product, мы поместили его в последнюю строку. Так вызывать такие функции?
Вызов функции
Чтобы вызвать функцию, укажите имя функции и добавьте необходимые параметры, разделенные пробелом. Например, чтобы вызвать функцию addAndMultiply(), введите следующий код.
addAndMultiply 2 3 3 // 15
Чтобы посмотреть результаты функции, можно либо назначить ее переменной, либо вывести напрямую.
let sum = addAndMultiply 2 3 3
printfn "%i" sum
// OR
printfn "%i" (addAndMultiply 2 3 3)
Выводимые типы
Рассмотрим следующий код:
let add a b = a + b
let sum = add 2 2
let concat = add "hello" "world" // will give compilation error
В последней строке этот код завершится с ошибкой со следующим сообщением.
error FS0001: This expression was expected to have type
'int'
but here has type
'string'
Причина сбоя в том, что F# уже определил, какой тип параметра следует использовать, и выбрал целое число. Причина такого решения в том, что информация размещена во второй строке, let sum = add 2 2. Функция add() явно указывает, что тип параметра определенно должен быть выражен целым числом.
Если второй строки не существует, код будет работать.
let add a b = a + b
// let sum = add 2 2
let concat = add "hello" "world" // will work
Компилятор видит, что при первом использовании функция оперирует строками, и приходит к выводу, что параметр имеет строковый тип. Таким образом, контекст и сначала используйте вывод типа.
Явные типы
Существуют ситуации, когда нужно явно указать типы принимаемых функцией параметров и возвращаемого ею значения. Скорее всего, компилятор справится и без этого, но так можно сделать код более удобным для чтения.
Рассмотрим следующий пример функции.
let convert a =
int a
Чтобы добавить в нее типы, добавьте :<type>.
let convert (a:string) =
int a
Теперь параметр имеет тип string, как объявлено в коде let convert (a:string). Добавив тип возвращаемого значения, можно сделать код еще понятнее. Для этого добавьте еще один :<type> сразу после параметра.
let convert (a:string) :int =
int a
Теперь круглые скобки заключены в параметр, как показано в (a:string)разделе . В данном случае типом возвращаемого значения является последний комментарий к :<type> — это :int. Язык F# способен разобраться в большинстве сценариев, но иногда стоит сделать код более понятным. Еще один плюс добавления типов состоит в том, что в этом случае другому разработчику будет проще понять, как он устроен.