В F# каждые данные имеют свой тип. Однако в прошлой теме, когда мы рассматривали определение значений, мы никаким образом не соприкасались с типами данных, никак их явным образом не указывали. Например:
let name = "Tom" printfn "%s" name
Однако компилятор F# достаточно умный, чтобы самостоятельно неявно вывести тип значений на основе присваиваемых им данных. Так, в примере выше значение
name
представляет тип string, поскольку значению присваивается строка - некоторый набор символов в двойных кавычках. И в реальности мы
могли бы также явным образом указать тип данных:
let name: string = "Tom" printfn "%s" name
Тип данных указывается после названия значения через двоеточие. Но опять же в данном случае указание типа данных избыточно, поскольку компилятор сам может определить тип.
Какие типы данных предлагает язык F#? Данный язык программирования в основном полагается на систему типу, которая является общей для платформы .NET. Итак, рассмотрим базовые типы данных в языке F#:
bool: хранит значение true
(истина) или false (ложь).
let isMarried = false let isEnabled: bool = true
byte: хранит целое число от 0 до 255.
let age: byte = 37uy printfn "Age: %d" age let number = 112uy printfn "Number: %d" number
Стоит отметить, что поскольку в F# много числовых типов данных, то чтобы различать значения этих типов, после числа указывается суффикс. Например, для типа byte
применяется суффикс uy
, который ставится после числа: 112uy
sbyte: хранит целое число от -128 до 127.
let rate: sbyte = 13y printfn "Rate: %d" rate let number = 112y printfn "Number: %d" number
Применяет суффикс y
int16: хранит целое число от -32768 до 32767.
let rate: int16 = 13s printfn "Rate: %d" rate let number = 112s printfn "Number: %d" number
Применяет суффикс s
uint16: хранит целое число от 0 до 65535.
let rate: uint16 = 13us printfn "Rate: %d" rate let number = 112us printfn "Number: %d" number
Применяет суффикс us
int: хранит целое число от -2 147 483 648 до 2 147 483 647.
let rate: int = 13 printfn "Rate: %d" rate let number = 112 printfn "Number: %d" number
Не использует суффиксов. Все целые числа без суффиксов по умолчанию рассматриваются как данные типа int
uint: хранит целое число от 0 до 4 294 967 295.
let rate: uint = 13u printfn "Rate: %d" rate let number = 112u printfn "Number: %d" number
Применяет суффикс u
int64: хранит целое число от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807.
let rate: int64 = 13L printfn "Rate: %d" rate let number = 112L printfn "Number: %d" number
Применяет суффикс L
uint64: хранит целое число от 0 до 18 446 744 073 709 551 615.
let rate: uint64 = 13UL printfn "Rate: %d" rate let number = 112UL printfn "Number: %d" number
Применяет суффикс UL
nativeint: нативный указатель на целое число со знаком. Например, nativeint 1
let rate: nativeint = nativeint 13 printfn "Rate: %d" rate let number = nativeint 112 printfn "Number: %d" number
unativeint: нативный указатель на целое число без знака. Например, unativeint 1
let rate: unativeint = unativeint 13 printfn "Rate: %d" rate let number = unativeint 112 printfn "Number: %d" number
float, double: число с плавающей точкой, которое занимает в памяти 64 бит.
let rate: float = 13.6 printfn "Rate: %f" rate let number: double = 35.07 printfn "Number: %f" number let height = 168.3 printfn "Height: %f" height
В качестве разделителя целой и дробной частей используется точка. Все дробные числа в F# по умолчанию воспринимаются как данные типа double/float
Для вывода дробных чисел на консоль с помощью функции printfn
применяется спецификатор %f
.
float32, single: число с плавающей точкой, которое занимает в памяти 32 бита.
let rate: float32 = 13.6f printfn "Rate: %f" rate let number: single = 35.07f printfn "Number: %f" number let height = 168f printfn "Height: %f" height
Применяет суффикс f
decimal: дробное число, которое имеет как минимум 28 значимых разрядов.
let rate: decimal= 13.6m printfn "Rate: %f" rate let number = 35m printfn "Number: %f" number
Применяет суффикс m
char: представляет отдельный символ Unicode, заключенный в одинарные кавычки. Например, 'c'
let a: char = 'a' printfn "%c" a let d = '5' printfn "%c" d
Для вывода символов на консоль с помощью функции printfn
применяется спецификатор %c
.
string: представляет строку символов Unicode в двойных кавычках. Например, "str"
let name: string = "Tom" printfn "Name: %s" name
Выше мы рассмотрели базовые типы F# и увидели, что, чтобы вывести на консоль значение того или иного типа, функция printfn
принимает определенный спецификатор:
%s
для строк, %d
для целых чисел, %f
для дробных символов, %c
для символов. С помощью этих спецификаторов
мы можем включить строку соответствующие данные. Например, возьмем следующую программу:
let name = "Tom" let age = 37 let height = 1.68 printfn "name: %s age: %d height: %f" name age height
Здесь функция printfn
выводит три значения: name, age и height. Они представляют разные типы, и для их вклеивания в строку применяются разные спецификаторы.
Все значения указываются после строки, в которую они встраиваются. Так, вместо первого спецификатора - %s
будет вставляться первое значение, которое должно представлять строку - в данном случае значение name.
Вместо второго спецификатора будет вставляться второе значение, которое должно представлять целое число - здесь значение age. И так далее.
Тем не менее есть более интуитивный подход, который представляет интерполяция строк. Интерполяция строк позволяет встроить в строку различные данные. Так, перепишем предыдущий пример с помощью интерполяции строк:
let name = "Tom" let age = 37 let height = 1.68 printfn $"name: {name} age: {age} height: {height}"
Для создании интерполированной строки перед ней указывается символ доллара $. Далее, чтобы встроить внутрь строки какое-нибудь значение,
внутри строки в фигурных скобках указывается встраиваемое значение. Например, в примере выше на место {name}
будет встраиваться значение name
, а на место
{age}
- значение age.
Стоит отметить, что данная возможность неограничена функцией printfn()
, а позволяет впринципе определить любую строку:
let name = "Tom" let age = 37 let user = $"User name: {name} User age: {age}" printfn $"{user}"
В данном случае определяется значение user
, которая представляет интерполированную строку, но по сути представляет тот же
тип string и может использоваться также, как и любая другая строка.
unit: представляет отсутствие текущего значения. Обычно применяется в ситуациях, в которых нужно наличие некоторого значения, но в то же время конкретное значение не важно и не имеет смысла. Для данного типа в F# предусмотрено специальное значение - () (скобки):
let undefined: unit = () let not = ()