Perché il protocollo Numeric di Swift non eredita dal protocollo Comparable?

1

Ho creato un generico class MyClass<T: Numeric> {...} e ho ottenuto errori nelle mie funzioni che hanno tentato di utilizzare > e < , lungo le linee di "Operatore binario" > " non può essere applicato a due operandi "T". " Ho passato un po 'di tempo a pensare che il problema fosse un errore di sintassi che avevo commesso nella dichiarazione. Ma sicuramente, Numeric non eredita da Comparable . Sono stordito. Perché dovrebbe essere?

    
posta GreatBigBore 31.08.2017 - 20:24
fonte

1 risposta

4

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.

    
risposta data 31.08.2017 - 21:17
fonte

Leggi altre domande sui tag