Типы данных и выведение типа

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

В 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 = ()
    
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850