Арифметические операторы (F#)
В этом разделе описаны арифметические операторы, которые доступны в языке F#.
Сводка бинарных арифметических операторов
В следующей таблице кратко описаны бинарные арифметические операторы, доступные для неупакованных целочисленных типов и типов с плавающей запятой.
Бинарный оператор |
Примечания |
---|---|
+ (сложение, плюс) |
Не проверяются.Возможно переполнение, когда при сложении чисел сумма превышает максимальное абсолютное значение, поддерживаемое типом. |
- (вычитание, минус) |
Не проверяются.Возможна потеря значимости при вычитании типов без знака, или если значения с плавающей запятой оказываются слишком маленькими для представления заданным типом. |
* (умножение) |
Не проверяются.Возможно переполнение, когда при перемножении чисел произведение превышает максимальное абсолютное значение, поддерживаемое типом. |
/ (деление) |
Для целочисленных типов деление на нуль вызывает исключение DivideByZeroException.Для типов с плавающей запятой деление на нуль приводит к специальным значениям с плавающей запятой +Infinity или -Infinity.Также возможна потеря значимости, если значения с плавающей запятой оказываются слишком маленькими для представления заданным типом. |
% (модуль, остаток) |
Возвращает остаток от деления.Знак результата совпадает со знаком первого операнда. |
** (экспонента, возведение в степень) |
Возможно переполнение, когда результат превышает максимальное абсолютное значение, поддерживаемое типом. Оператор возведения в степень применим только к типам с плавающей запятой. |
Сводка унарных арифметических операторов
В следующей таблице кратко описаны унарные арифметические операторы, доступные для целочисленных типов и типов с плавающей запятой.
Унарный оператор |
Примечания |
---|---|
+ (плюс) |
Может применяться к любому арифметическому выражению.Не изменяет знак значения. |
- (отрицание, минус) |
Может применяться к любому арифметическому выражению.Изменяет знак значения. |
При возникновении переполнения или потери значимости для целых чисел происходит "циклический переход".Это приводит к появлению неверного результата.Переполнение для целых чисел представляет собой потенциально опасную проблему, которая может привести к серьезным неполадкам, если в программном обеспечении не предусмотрены соответствующие механизмы обработки подобных ситуаций.Если это важно для разрабатываемого приложения, следует рассмотреть возможность использования проверяемых операторов (Microsoft.FSharp.Core.Operators.Checked).
Сводка бинарных операторов сравнения
В следующей таблице описаны бинарные операторы сравнения, доступные для целочисленных типов и типов с плавающей запятой.Эти операторы возвращают значения типа bool.
Никогда не сравнивайте в явном виде значения чисел с плавающей запятой, поскольку представление чисел с плавающей запятой IEEE не поддерживает операцию точного равенства.Два числа, которые могут казаться равными при проверке кода, могут иметь различные битовые представления.
Оператор |
Примечания |
---|---|
= (равенство, равняется) |
Это не оператор присваивания.Он используется только для сравнения.Это универсальный оператор. |
> (больше) |
Это универсальный оператор. |
< (меньше) |
Это универсальный оператор. |
>= (больше или равно) |
Это универсальный оператор. |
<= (меньше или равно) |
Это универсальный оператор. |
<> (не равно) |
Это универсальный оператор. |
Перегруженные и универсальные операторы
Все описанные в данном разделе операторы определены в пространстве имен Microsoft.FSharp.Core.Operators.Некоторые операторы определены с помощью статически разрешаемых параметров типов.Это значит, что имеются отдельные определения для каждого конкретного типа, поддерживающего данный оператор.К этой категории относятся все унарные и бинарные арифметические и побитовые операторы.Операторы сравнения являются универсальными и работают с любым типом, а не только с простыми арифметическими типами.У размеченного объединения и типов записей имеются собственные пользовательские реализации, которые создаются компилятором F#.Типы классов используют метод Equals.
Универсальные операторы можно настраивать.Чтобы настроить функции сравнения, переопределите метод Equals с использованием собственных правил определения равенства, а затем реализуйте интерфейс IComparable.Интерфейс IComparable содержит единственный метод — CompareTo.
Операторы и определение типа
Использование оператора в выражении ограничивает определение типа для этого оператора.Кроме того, использование операторов не допускает автоматического обобщения, поскольку использование операторов подразумевает, что операнды относятся к арифметическим типам.В отсутствии другой информации компилятор F# использует в качестве типа арифметических выражений тип int.Это поведение можно переопределить, указав другой тип.Так, предполагается, что аргументы и возвращаемое значение функции function1 в следующем фрагменте кода имеют тип int, а соответствующие значения для функции function2 — тип float.
// x, y and return value inferred to be int
// function1: int -> int -> int
let function1 x y = x + y
// x, y and return value inferred to be float
// function2: float -> float -> float
let function2 (x: float) y = x + y