La ragione per cui div
non restituisce Infinity
è semplice: non esiste alcuna rappresentazione per infinito nel tipo Integer
.
/
rendimenti Infinity
perché segue lo standard IEEE 754 poiché il tipo predefinito Fractional
(che descrive galleggianti rappresentazioni numeriche punto) è Double
. Anche altre lingue con numeri in virgola mobile (ad es. JavaScript) presentano questo comportamento.
Per rendere matematici rabbrividire ancora di più, si ottiene un risultato diverso se si divide da negativo 0, nonostante il fatto che -0 == 0
per i galleggianti:
Prelude> 1/(-0)
-Infinity
Questo è anche il comportamento dallo standard.
Se si utilizza un tipo diverso frazionale come Rational
, si otterrà il comportamento che si aspettano:
Prelude> 1/(0 :: Rational)
*** Exception: Ratio.%: zero denominator
Per coincidenza, se vi state chiedendo sul perché Integer
e Double
sono i tipi in questione quando il funzionamento effettivo non li fa riferimento, dai un'occhiata a come Haskell gestisce i tipi predefiniti (in particolare i tipi numerici) nello report.
La versione breve è che se si dispone di un tipo ambiguo dalla classe Num
, Haskell tenterà prima Integer
e poi Double
per quel tipo. È possibile modificare questo con una dichiarazione default (Type1, Type2...)
o disattivarlo con una dichiarazione default()
a livello di modulo.
fonte
2012-02-19 22:52:34
Matematicamente, avere il risultato di '1/0' essere' Infinito' è completamente giustificato. Non è l'unico valore di ritorno giustificabile, ma quello che ha più senso. Notare che si otterrà anche un errore 'divide per zero' se si valuta' 1/0 :: Rational'. –
@DanielFischer: Non lo chiamerei "matematicamente completamente giustificato", in quanto questo tipo di compattazione (con infinito positivo e negativo) distrugge un bel po 'di teoremi che resistono a ℝ, e alcuni di questi sono assunti in molti programmi. – leftaroundabout
Non dovresti assumere cose del genere quando lavori con numeri in virgola mobile. Anche le proprietà di base come l'associatività non sono necessariamente valide. L'uguaglianza non è anche riflessiva per 'NaN's! (Ad esempio '(0/0)/= (0/0)'. –