Арифметические операторы (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