受Common Lisp與Scheme影響露泊,Haskell提供了多種類型的數(shù)字步悠。
使用類型類(type class)欣簇,數(shù)字類型上面的操作符或者函數(shù)巾钉,大多是重載的(overloaded)翘狱。
(甚至,值也是重載的砰苍,見(jiàn)1::Num a => a 潦匈。。
不同的數(shù)值定義在了不同的類型類中赚导。
> :t 1
> 1 :: Num a => a
> :t 1.0
> 1.0 :: Fractional a => a
如圖茬缩,類型類之間是有包含關(guān)系的。吼旧。
例如凰锡,Num類型類是Eq的子集,因?yàn)槊恳粋€(gè)數(shù)字必須首先能被判斷相等性黍少。
Num的子集Real也是Ord的子集寡夹,因?yàn)閷?shí)數(shù)可以比較大小,而復(fù)數(shù)不能厂置。
Integral類型類包含了所有限制大小和無(wú)限制大小的整數(shù)菩掏。
Fractional類型類包含所有非整數(shù)類型的數(shù)字。
Floating類型類包含了所有浮點(diǎn)數(shù)類型的數(shù)字昵济,包括實(shí)數(shù)和復(fù)數(shù)智绸。
Prelude僅包含一部分?jǐn)?shù)字類型野揪,
Int,定寬整數(shù)(fixed sized integer)
Integer瞧栗,任意精度的整數(shù)
Float斯稳,單精度浮點(diǎn)數(shù)
Double,雙精度浮點(diǎn)數(shù)
其他數(shù)字類型迹恐,例如Rational和Complex定義在了庫(kù)(library)中挣惰。
Rational類型的值是兩個(gè)Integer的比例,定義在了Ratio庫(kù)中殴边。
(1)Integral to Num
Integral包含了所有的整數(shù)憎茂,該類型類兩個(gè)常用的實(shí)例是Integer類型和Int類型。
Integer锤岸,表示任意精度的整數(shù)竖幔,也成為“大整數(shù)”(bignum,big-integer)是偷。
Int拳氢,是定寬的整數(shù),具體存儲(chǔ)位寬取決于特定的機(jī)器蛋铆,但至少應(yīng)該包括-229~229-1范圍內(nèi)的整數(shù)馋评。
我們主要使用fromIntegral
對(duì)Integral進(jìn)行轉(zhuǎn)換。
它把一個(gè)Integral類型類實(shí)例類型的值戒职,轉(zhuǎn)換成Num類型類實(shí)例類型的值栗恩。
fromIntegral :: (Integral a, Num b) => a -> b
例如,給定一個(gè)Int類型的值n洪燥,我們不能直接使用sqrt n
求平方根,
因?yàn)?code>sqrt只接受Floating類型類實(shí)例類型的參數(shù)乳乌。
sqrt :: Floating a => a -> a
我們必須寫成捧韵,
sqrt (fromIntegral n)
關(guān)于Integer類型還有兩個(gè)更具體的函數(shù)。
fromInteger :: Num a => Integer -> a
toInteger :: Integral a => a -> Integer
(2)Real to Fractional
RealFrac包含所有的整數(shù)和分?jǐn)?shù)汉操,該類型類兩個(gè)常用的實(shí)例是Rational類型和Double類型再来。
Rational,任意精度的分?jǐn)?shù)磷瘤。
Double芒篷,雙精度浮點(diǎn)數(shù)。
Real類型類包含Integral和RealFrac采缚。
我們主要使用realToFrac
來(lái)對(duì)Real進(jìn)行轉(zhuǎn)換针炉。
realToFrac :: (Real a, Fractional b) => a -> b
關(guān)于Rational類型還有兩個(gè)更具體的函數(shù)。
fromRational :: Fractional a => Rational -> a
toRational :: Real a => a -> Rational
(3)RealFrac to Integral
這種轉(zhuǎn)換可能會(huì)損失精度扳抽,我們可以使用下面4個(gè)函數(shù)篡帕。
ceiling :: (RealFrac a, Integral b) => a -> b
floor :: (RealFrac a, Integral b) => a -> b
truncate :: (RealFrac a, Integral b) => a -> b
round :: (RealFrac a, Integral b) => a -> b
(4)Float to Double
我們可以使用GHC.FLoat
module來(lái)對(duì)浮點(diǎn)數(shù)進(jìn)行轉(zhuǎn)換殖侵。
float2Double :: Float -> Double
double2Float :: Double -> Float
參考:
The Haskell 98 Report: Standard Haskell Classes
Converting numbers