2015-08-05 17 views
5

vorrei una chiara spiegazione di Num, Real, Integral, Integer, Int, Ratio, Rational, Double, Float.Spiegazione dei numeri in Haskell

+2

Potrebbe piacere il [grafico del Rapporto] (https://www.haskell.org/onlinereport/haskell2010/haskellch6.html#x13-1270011) che dettaglia le relazioni tra classi e tipi standard. –

+1

Per i principianti, questo aiuto? https://wiki.haskell.org/Converting_numbers – ErikR

+0

Dovresti dare un'occhiata qui: https://en.wikibooks.org/wiki/Haskell/Type_basics_II –

risposta

9

Questa risposta presuppone principalmente che si conosca la differenza tra tipi e classi di tipi. Se quella differenza è confusa per te allora clear up your understanding lì prima di leggere.

Num

Num è un typeclass che include tutti i tipi numerici.

:info Num 
class Num a where 
    (+) :: a -> a -> a 
    (-) :: a -> a -> a 
    (*) :: a -> a -> a 
    negate :: a -> a 
    abs :: a -> a 
    signum :: a -> a 
    fromInteger :: Integer -> a 
     -- Defined in ‘GHC.Num’ 
instance Num Word -- Defined in ‘GHC.Num’ 
instance Num Integer -- Defined in ‘GHC.Num’ 
instance Num Int -- Defined in ‘GHC.Num’ 
instance Num Float -- Defined in ‘GHC.Float’ 
instance Num Double -- Defined in ‘GHC.Float’ 

reale

Anche un typeclass copre quei tipi che può essere rappresentato come un valore reale (il tipo Rational).

:info Real 
class (Num a, Ord a) => Real a where 
    toRational :: a -> Rational 
     -- Defined in ‘GHC.Real’ 
instance Real Word -- Defined in ‘GHC.Real’ 
instance Real Integer -- Defined in ‘GHC.Real’ 
instance Real Int -- Defined in ‘GHC.Real’ 
instance Real Float -- Defined in ‘GHC.Float’ 
instance Real Double -- Defined in ‘GHC.Float’ 

integrale

Una classe tipo per gli integrali, si sa, ...,-2,-1,0,1,.... Tipi come Integer (aka big int), Int, Int64, ecc sono istanze.

:info Integral 
class (Real a, Enum a) => Integral a where 
    quot :: a -> a -> a 
    rem :: a -> a -> a 
    div :: a -> a -> a 
    mod :: a -> a -> a 
    quotRem :: a -> a -> (a, a) 
    divMod :: a -> a -> (a, a) 
    toInteger :: a -> Integer 
     -- Defined in ‘GHC.Real’ 
instance Integral Word -- Defined in ‘GHC.Real’ 
instance Integral Integer -- Defined in ‘GHC.Real’ 
instance Integral Int -- Defined in ‘GHC.Real’ 

Integer

Un tipo, non è una classe di tipo come ad esempio quello di cui abbiamo parlato fino ad ora, che può rappresentare numeri interi non limitati. Quindi 2^3028 è un valore legale.

Int

A larghezza fissa solidale. Nel compilatore GHC questo è 32 o 64 bit a seconda dell'architettura. Il linguaggio Haskell garantisce solo che questo sarà di almeno 29 bit.

Rapporto

Questo è un costruttore di tipo, quindi si dovrebbe dire qualcosa di simile Ratio Integer per ottenere un tipo per il rapporto di due numeri interi (matematicamente a/b).

razionale

Beh un razionale è letteralmente un rapporto di due numeri interi, capire il rapporto e il gioco è fatto:

:i Rational 
type Rational = Ratio Integer 

doppio

Un tipo per doppia precisione floating valori in punti.

Float

Un tipo di valori virgola mobile in singola precisione.

+1

'Rapporto 'è il rapporto di due valori con * qualsiasi * tipo numerico. 'Rational' è il rapporto tra due * interi arbitrari di precisione *. – MathematicalOrchid

0

C'è un'immagine interessante nel Haskell documentation che mostra le relazioni tra classi e le loro istanze di tipo, che coprono la maggior parte di quelli che hai menzionato:

Per quanto riguarda la Rational numbers:

Per ogni tipo Integral t, esiste un tipo Ratio t di coppie razionali con componenti di tipo t. Il nome tipo Rational è un sinonimo di Ratio Integer.