Operadores aritméticos

En este tema se describen los operadores aritméticos que están disponibles en F#.

Resumen de operadores aritméticos binarios

En la tabla siguiente se resumen los operadores aritméticos binarios que están disponibles para los tipos enteros y de punto flotante sin conversión boxing.

Operador binario Notas
+ (suma, más) No comprobado. Posible condición de desbordamiento cuando los números se agregan juntos y la suma supera el valor absoluto máximo admitido por el tipo.
- (resta, menos) No comprobado. Posible condición de subdesbordamiento cuando se restan tipos sin signo o cuando los valores de punto flotante son demasiado pequeños para ser representados por el tipo.
* (multiplicación, veces) No comprobado. Posible condición de desbordamiento cuando los números se multiplican y el producto supera el valor absoluto máximo admitido por el tipo.
/ (división, dividido por) La división por cero provoca una excepción DivideByZeroException en los tipos enteros. En los tipos de punto flotante, la división por cero proporciona los valores de punto flotante especiales +Infinity o -Infinity. También hay una posible condición de subdesbordamiento cuando un número de punto flotante es demasiado pequeño para ser representado por el tipo.
% (resto, rest) Devuelve el resto de una operación de división. El signo del resultado es igual que el signo del primer operando.
** (exponenciación, a la potencia) Posible condición de desbordamiento cuando el resultado supera el valor absoluto máximo del tipo.

El operador de exponenciación solo funciona con tipos de punto flotante.

Resumen de operadores aritméticos unarios

En la tabla siguiente se resumen los operadores aritméticos unarios que están disponibles para los tipos enteros y de punto flotante.

Operador unario Notas
+ (positivo) Se puede aplicar a cualquier expresión aritmética. No cambia el signo del valor.
- (negación, negativo) Se puede aplicar a cualquier expresión aritmética. Cambia el signo del valor.

El comportamiento de los tipos enteros en caso de desbordamiento o subdesbordamiento consiste en encapsularse. Esto provoca un resultado incorrecto. El desbordamiento de enteros es un problema potencialmente grave que puede contribuir a problemas de seguridad cuando el software no se ha escrito para tenerlo en cuenta. Si se trata de un problema para la aplicación, considere la posibilidad de usar los operadores comprobados de Microsoft.FSharp.Core.Operators.Checked.

Resumen de operadores de comparación binarios

En la tabla siguiente se muestran los operadores de comparación binarios que están disponibles para los tipos enteros y de punto flotante. Estos operadores devuelven valores de tipo bool.

Los números de punto flotante nunca deben compararse directamente para detectar igualdad, ya que la representación de punto flotante IEEE no admite una operación de igualdad exacta. Dos números que se puede comprobar fácilmente que son iguales al inspeccionar el código podrían tener en realidad representaciones de bits diferentes.

Operador Notas
= (igualdad, igual a) No es un operador de asignación. Solo se usa para comparar. Se trata de un operador genérico.
> (mayor que) Se trata de un operador genérico.
< (menor que) Se trata de un operador genérico.
>= (mayor o igual que) Se trata de un operador genérico.
<= (menor o igual que) Se trata de un operador genérico.
<> (no igual) Se trata de un operador genérico.

Operadores sobrecargados y genéricos

Todos los operadores tratados en este tema se definen en el espacio de nombres Microsoft.FSharp.Core.Operators. Algunos de los operadores se definen mediante parámetros de tipo resueltos estáticamente. Esto significa que hay definiciones individuales para cada tipo específico que funciona con ese operador. Todos los operadores unarios y binarios aritméticos y bit a bit están en esta categoría. Los operadores de comparación son genéricos y, por tanto, funcionan con cualquier tipo, no solo tipos aritméticos primitivos. Los tipos de unión y registro discriminados tienen sus propias implementaciones personalizadas generadas por el compilador de F#. Los tipos de clase usan el método Equals.

Los operadores genéricos son personalizables. Para personalizar las funciones de comparación, invalide Equals para proporcionar su propia comparación de igualdad personalizada y luego implemente IComparable. La interfaz System.IComparable tiene un único método, CompareTo.

Operadores e inferencia de tipos

El uso de un operador en una expresión restringe la inferencia de tipos en ese operador. Además, el uso de operadores evita la generalización automática, ya que el uso de operadores implica un tipo aritmético. En ausencia de cualquier otra información, el compilador de F# deduce int como el tipo de las expresiones aritméticas. Puede invalidar este comportamiento si especifica otro tipo. Así, los tipos de argumento y el tipo de valor devuelto de function1 en el código siguiente se deducen como int, pero los tipos de function2 se deducen como 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

Consulte también