Operatori aritmetici
In questo argomento vengono descritti gli operatori aritmetici disponibili in F#.
Riepilogo degli operatori aritmetici binari
La tabella seguente riepiloga gli operatori aritmetici binari disponibili per i tipi integrali unboxed e a virgola mobile.
Operatore binario | Note |
---|---|
+ (addizione, più) |
Deselezionato. Possibile condizione di overflow quando i numeri vengono aggiunti insieme e la somma supera il valore assoluto massimo supportato dal tipo. |
- (sottrazione, meno) |
Deselezionato. Condizione di underflow possibile quando i tipi senza segno vengono sottratti o quando i valori a virgola mobile sono troppo piccoli per essere rappresentati dal tipo. |
* (moltiplicazione, tempi) |
Deselezionato. Possibile condizione di overflow quando i numeri vengono moltiplicati e il prodotto supera il valore assoluto massimo supportato dal tipo. |
/ (divisione, diviso per) |
La divisione per zero causa un DivideByZeroException per i tipi integrali. Per i tipi a virgola mobile, la divisione per zero fornisce i valori speciali a virgola mobile infinity o -infinity . Esiste anche una possibile condizione di underflow quando un numero a virgola mobile è troppo piccolo per essere rappresentato dal tipo. |
% (resto, rem) |
Restituisce il resto di un'operazione di divisione. Il segno del risultato è uguale al segno del primo operando. |
** (elevamento a potenza, alla potenza di) |
Possibile condizione di overflow quando il risultato supera il valore assoluto massimo per il tipo. L'operatore dell’elevamento a potenza funziona solo con tipi a virgola mobile. |
Riepilogo degli operatori aritmetici unari
La tabella seguente riepiloga gli operatori aritmetici unari disponibili per i tipi integrali e a virgola mobile.
Operatore unario | Note |
---|---|
+ (positivo) |
Può essere applicato a qualsiasi espressione aritmetica. Non modifica il segno del valore. |
- (negazione, negativo) |
Può essere applicato a qualsiasi espressione aritmetica. Modifica il segno del valore. |
Il comportamento in corrispondenza dell'overflow o dell'underflow per i tipi integrali consiste nell'eseguire il wrapping. Ciò causa un risultato non corretto. L'overflow dei valori inter è un problema potenzialmente grave che può contribuire a creare problemi di sicurezza quando il software non viene scritto in modo da tenerne conto. Se si tratta di un problema per l'applicazione, è consigliabile usare gli operatori controllati in Microsoft.FSharp.Core.Operators.Checked
.
Riepilogo degli operatori di confronto binario
La tabella seguente illustra gli operatori di confronto binari disponibili per i tipi integrali e a virgola mobile. Questi operatori restituiscono valori di tipo bool
.
I numeri a virgola mobile non devono mai essere confrontati direttamente per verificarne l'uguaglianza, perché la rappresentazione a virgola mobile IEEE non supporta un'operazione di uguaglianza esatta. Due numeri che si possono facilmente verificare come uguali controllando il codice potrebbero effettivamente avere rappresentazioni di bit diverse.
Operatore | Note |
---|---|
= (uguaglianza, uguale) |
Non si tratta di un operatore di assegnazione. Viene usato solo per il confronto. Si tratta di un operatore generico. |
> (maggiore di) |
Si tratta di un operatore generico. |
< (minore di) |
Si tratta di un operatore generico. |
>= (maggiore o uguale a) |
Si tratta di un operatore generico. |
<= (minore o uguale a) |
Si tratta di un operatore generico. |
<> (diverso da) |
Si tratta di un operatore generico. |
Operatori di overload e generici
Tutti gli operatori descritti in questo argomento sono definiti nello spazio dei nomi Microsoft.FSharp.Core.Operators. Alcuni operatori vengono definiti usando parametri di tipo risolti in modo statico. Ciò significa che sono presenti singole definizioni per ogni tipo specifico che funziona con tale operatore. Tutti gli operatori aritmetici unari e binari e gli operatori bit per bi rientrano in questa categoria. Gli operatori di confronto sono generici e pertanto funzionano con qualsiasi tipo, non solo con tipi aritmetici primitivi. I tipi di unione e record discriminati hanno implementazioni personalizzate generate dal compilatore F#. I tipi di classe usano il metodo Equals.
Gli operatori generici sono personalizzabili. Per personalizzare le funzioni di confronto, eseguire l'override di Equals per fornire un confronto di uguaglianza personalizzato e quindi implementare IComparable. L'interfaccia System.IComparable ha un singolo metodo, ovvero il metodo CompareTo.
Operatori e inferenza dei tipi
L'uso di un operatore in un'espressione vincola l'inferenza del tipo su tale operatore. Inoltre, l'uso degli operatori impedisce la generalizzazione automatica, perché l'uso degli operatori implica un tipo aritmetico. In assenza di altre informazioni, il compilatore F# deduce int
come tipo di espressioni aritmetiche. È possibile eseguire l'override di questo comportamento specificando un valore per un altro tipo. Di conseguenza, i tipi di argomento e il tipo restituito di function1
nel codice seguente vengono dedotti per essere int
, ma i tipi per function2
vengono dedotti per essere 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