Esiste un tipo numerico notevole che non è comparabile: numeri complessi.
I numeri complessi consistono in una parte "reale" e "immaginaria" o equivalentemente in "grandezza" e "fase". Non esiste un ordine evidente per i numeri immaginari. Non includendo Comparable, il protocollo numerico potrebbe essere utilizzato anche per rappresentare numeri complessi.
Nota che Numeric
non include anche la divisione. Non sono sicuro del motivo per cui è stato escluso, ma nota che la divisione è solo parzialmente definita per i numeri interi, ad es. 3/2
non produce un valore intero. Diverse lingue affrontano questo in modo diverso (C arrotonda a zero, i linguaggi sensibili producono numeri in virgola mobile, Perl6 produce numeri razionali, ...). Sembra quindi legittimo escludere queste decisioni da un protocollo molto fondamentale come Numeric piuttosto che forzare i tipi di implementazione a prendere una decisione.
(Più formalmente: i tipi numerici comuni sono chiusi in addizione e moltiplicazione.I tipi senza segno con underflow (cioè l'aritmetica modulare) e i tipi firmati sono anche chiusi in sottrazione.Iterti non sono chiusi in divisione.La chiusura significa che il tipo di output di un l'operazione è uguale al tipo di input.)
Mentre Numeric è focalizzato sui valori scalari , ci sono molti esempi di costrutti matematici (non scalari) che non hanno né ordine né divisione. In particolare, vettori e matrici.
I protocolli dovrebbero essere il minimo possibile mentre sono ancora utili. Non dovrebbero limitare i tipi non necessari. Confronta anche i principi SOLID: il Interfaccia Segregation Principle (ISP) afferma che gli utenti non dovrebbero essere costretti a dipendere da metodi che non usano.